16f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 26f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 36f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 46f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Use of this source code is governed by a BSD-style license 56f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * that can be found in the LICENSE file in the root of the source 66f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * tree. An additional intellectual property rights grant can be found 76f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in the file PATENTS. All contributing project authors may 86f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * be found in the AUTHORS file in the root of the source tree. 96f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * isac.c 136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This C file contains the functions for the ISAC API 156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "isac.h" 196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "bandwidth_estimator.h" 206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "crc.h" 216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "entropy_coding.h" 226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "codec.h" 236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "structs.h" 246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "signal_processing_library.h" 256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_shape_swb16_tables.h" 266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "os_specific_inline.h" 276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <stdio.h> 296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <string.h> 306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <stdlib.h> 316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <math.h> 326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#define BIT_MASK_DEC_INIT 0x0001 346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#define BIT_MASK_ENC_INIT 0x0002 356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#define LEN_CHECK_SUM_WORD8 4 376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#define MAX_NUM_LAYERS 10 386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * UpdatePayloadSizeLimit(...) 426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Call this function to update the limit on the payload size. The limit on 446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * payload size might change i) if a user ''directly changes the limit by 456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * calling xxx_setMaxPayloadSize() or xxx_setMaxRate(), or ii) indirectly 466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * when bandwidth is changing. The latter might be the result of bandwidth 476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * adaptation, or direct change of the bottleneck in instantaneous mode. 486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function takes the current overall limit on payload, and translates it 506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to the limits on lower and upper-band. If the codec is in wideband mode, 516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * then the overall limit and the limit on the lower-band is the same. 526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Otherwise, a fraction of the limit should be allocated to lower-band 536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * leaving some room for the upper-band bit-stream. That is why an update 546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of limit is required every time that the bandwidth is changing. 556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic void UpdatePayloadSizeLimit(ISACMainStruct* instISAC) { 586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 lim30MsPayloadBytes = WEBRTC_SPL_MIN( 596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->maxPayloadSizeBytes), 606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->maxRateBytesPer30Ms)); 616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 lim60MsPayloadBytes = WEBRTC_SPL_MIN( 626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->maxPayloadSizeBytes), 636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->maxRateBytesPer30Ms << 1)); 646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* The only time that iSAC will have 60 ms 666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * frame-size is when operating in wideband, so 676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * there is no upper-band bit-stream. */ 686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->bandwidthKHz == isac8kHz) { 706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* At 8 kHz there is no upper-band bit-stream, 716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * therefore, the lower-band limit is the overall limit. */ 726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.payloadLimitBytes60 = 736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lim60MsPayloadBytes; 746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 = 756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lim30MsPayloadBytes; 766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* When in super-wideband, we only have 30 ms frames. 786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Do a rate allocation for the given limit. */ 796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (lim30MsPayloadBytes > 250) { 806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 4/5 to lower-band the rest for upper-band. */ 816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 = 826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (lim30MsPayloadBytes << 2) / 5; 836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (lim30MsPayloadBytes > 200) { 846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* For the interval of 200 to 250 the share of 856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * upper-band linearly grows from 20 to 50. */ 866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 = 876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (lim30MsPayloadBytes << 1) / 5 + 100; 886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Allocate only 20 for upper-band. */ 906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 = 916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lim30MsPayloadBytes - 20; 926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instUB.ISACencUB_obj.maxPayloadSizeBytes = 946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lim30MsPayloadBytes; 956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 1006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * UpdateBottleneck(...) 1016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function updates the bottleneck only if the codec is operating in 1036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * channel-adaptive mode. Furthermore, as the update of bottleneck might 1046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * result in an update of bandwidth, therefore, the bottlenech should be 1056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * updated just right before the first 10ms of a frame is pushed into encoder. 1066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 1086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic void UpdateBottleneck(ISACMainStruct* instISAC) { 1096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Read the bottleneck from bandwidth estimator for the 1106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * first 10 ms audio. This way, if there is a change 1116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in bandwidth, upper and lower-band will be in sync. */ 1126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->codingMode == 0) && 1136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->instLB.ISACencLB_obj.buffer_index == 0) && 1146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->instLB.ISACencLB_obj.frame_nb == 0)) { 1156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 bottleneck; 1166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetUplinkBandwidth(&(instISAC->bwestimator_obj), 1176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &bottleneck); 1186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Adding hysteresis when increasing signal bandwidth. */ 1206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->bandwidthKHz == isac8kHz) 1216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin && (bottleneck > 37000) 1226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin && (bottleneck < 41000)) { 1236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bottleneck = 37000; 1246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Switching from 12 kHz to 16 kHz is not allowed at this revision. 1276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * If we let this happen, we have to take care of buffer_index and 1286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the last LPC vector. */ 1296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->bandwidthKHz != isac16kHz) && 1306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (bottleneck > 46000)) { 1316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bottleneck = 46000; 1326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We might need a rate allocation. */ 1356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacWideband) { 1366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Wideband is the only choice we have here. */ 1376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.bottleneck = 1386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (bottleneck > 32000) ? 32000 : bottleneck; 1396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac8kHz; 1406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 1416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Do the rate-allocation and get the new bandwidth. */ 1426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth bandwidth; 1436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_RateAllocation(bottleneck, 1446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &(instISAC->instLB.ISACencLB_obj.bottleneck), 1456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &(instISAC->instUB.ISACencUB_obj.bottleneck), 1466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &bandwidth); 1476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth != isac8kHz) { 1486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.new_framelength = 480; 1496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth != instISAC->bandwidthKHz) { 1516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Bandwidth is changing. */ 1526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = bandwidth; 1536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UpdatePayloadSizeLimit(instISAC); 1546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth == isac12kHz) { 1556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.buffer_index = 0; 1566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Currently we don't let the bandwidth to switch to 16 kHz 1586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * if in adaptive mode. If we let this happen, we have to take 1596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * care of buffer_index and the last LPC vector. */ 1606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 1646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 1676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * GetSendBandwidthInfo(...) 1686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This is called to get the bandwidth info. This info is the bandwidth and 1706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the jitter of 'there-to-here' channel, estimated 'here.' These info 1716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * is signaled in an in-band fashion to the other side. 1726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * The call to the bandwidth estimator triggers a recursive averaging which 1746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * has to be synchronized between encoder & decoder, therefore, the call to 1756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * BWE should be once per packet. As the BWE info is inserted into bit-stream 1766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * We need a valid info right before the encodeLB function is going to 1776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * generate a bit-stream. That is when lower-band buffer has already 20ms 1786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of audio, and the 3rd block of 10ms is going to be injected into encoder. 1796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Inputs: 1816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - instISAC : iSAC instance. 1826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Outputs: 1846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - bandwidthIndex : an index which has to be encoded in 1856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * lower-band bit-stream, indicating the 1866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bandwidth of there-to-here channel. 1876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - jitterInfo : this indicates if the jitter is high 1886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * or low and it is encoded in upper-band 1896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream. 1906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 1926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic void GetSendBandwidthInfo(ISACMainStruct* instISAC, 1936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* bandwidthIndex, 1946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* jitterInfo) { 1956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->instLB.ISACencLB_obj.buffer_index == 1966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (FRAMESAMPLES_10ms << 1)) && 1976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->instLB.ISACencLB_obj.frame_nb == 0)) { 1986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Bandwidth estimation and coding. */ 1996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetDownlinkBwJitIndexImpl(&(instISAC->bwestimator_obj), 2006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bandwidthIndex, jitterInfo, 2016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz); 2026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 2076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_AssignSize(...) 2086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function returns the size of the ISAC instance, so that the instance 2106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * can be created out side iSAC. 2116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 2136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - sizeinbytes : number of bytes needed to allocate for the 2146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * instance. 2156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - Ok 2176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 2186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 2196f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_AssignSize(int* sizeInBytes) { 2206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *sizeInBytes = sizeof(ISACMainStruct) * 2 / sizeof(WebRtc_Word16); 2216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 2226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 2266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_Assign(...) 2276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function assigns the memory already created to the ISAC instance. 2296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 2316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : address of the pointer to the coder instance. 2326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - instISAC_Addr : the already allocated memory, where we put the 2336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * iSAC structure. 2346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - Ok 2366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 2376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 2386f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_Assign(ISACStruct** ISAC_main_inst, 2396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin void* instISAC_Addr) { 2406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC_Addr != NULL) { 2416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)instISAC_Addr; 2426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = 0; 2436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->initFlag = 0; 2446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Assign the address. */ 2466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *ISAC_main_inst = (ISACStruct*)instISAC_Addr; 2476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Default is wideband. */ 2496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz = kIsacWideband; 2506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz = kIsacWideband; 2516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac8kHz; 2526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 2536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 2546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 2556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 2606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_Create(...) 2616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function creates an ISAC instance, which will contain the state 2636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * information for one coding/decoding channel. 2646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 2666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : address of the pointer to the coder instance. 2676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - Ok 2696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 2706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 2716f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_Create(ISACStruct** ISAC_main_inst) { 2726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC; 2736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC = (ISACMainStruct*)WEBRTC_SPL_VNEW(ISACMainStruct, 1); 2756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *ISAC_main_inst = (ISACStruct*)instISAC; 2766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (*ISAC_main_inst != NULL) { 2776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = 0; 2786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->initFlag = 0; 2796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Default is wideband. */ 2806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac8kHz; 2816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz = kIsacWideband; 2826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz = kIsacWideband; 2836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 2846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 2856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 2866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 2916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_Free(...) 2926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function frees the ISAC instance created at the beginning. 2946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 2966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : a ISAC instance. 2976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - Ok 2996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 3006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 3016f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_Free(ISACStruct* ISAC_main_inst) { 3026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 3036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WEBRTC_SPL_FREE(instISAC); 3046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 3056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 3066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 3096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * EncoderInitLb(...) - internal function for initialization of 3106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Lower Band 3116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * EncoderInitUb(...) - internal function for initialization of 3126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Upper Band 3136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_EncoderInit(...) - API function 3146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function initializes a ISAC instance prior to the encoder calls. 3166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 3186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 3196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - CodingMode : 0 -> Bit rate and frame length are automatically 3206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * adjusted to available bandwidth on 3216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * transmission channel, applicable just to 3226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * wideband mode. 3236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1 -> User sets a frame length and a target bit 3246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * rate which is taken as the maximum 3256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * short-term average bit rate. 3266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - Ok 3286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 3296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 3306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic WebRtc_Word16 EncoderInitLb(ISACLBStruct* instLB, 3316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 codingMode, 3326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum IsacSamplingRate sampRate) { 3336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 statusInit = 0; 3346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 3356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Init stream vector to zero */ 3376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < STREAM_SIZE_MAX_60; k++) { 3386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.bitstr_obj.stream[k] = 0; 3396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((codingMode == 1) || (sampRate == kIsacSuperWideband)) { 3426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 30 ms frame-size if either in super-wideband or 3436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * instantaneous mode (I-mode). */ 3446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.new_framelength = 480; 3456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 3466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.new_framelength = INITIAL_FRAMESAMPLES; 3476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitMasking(&instLB->ISACencLB_obj.maskfiltstr_obj); 3506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitPreFilterbank(&instLB->ISACencLB_obj.prefiltbankstr_obj); 3516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitPitchFilter(&instLB->ISACencLB_obj.pitchfiltstr_obj); 3526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitPitchAnalysis( 3536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instLB->ISACencLB_obj.pitchanalysisstr_obj); 3546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.buffer_index = 0; 3566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.frame_nb = 0; 3576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Default for I-mode. */ 3586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.bottleneck = 32000; 3596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.current_framesamples = 0; 3606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.s2nr = 0; 3616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.payloadLimitBytes30 = STREAM_SIZE_MAX_30; 3626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.payloadLimitBytes60 = STREAM_SIZE_MAX_60; 3636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.maxPayloadBytes = STREAM_SIZE_MAX_60; 3646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.maxRateInBytes = STREAM_SIZE_MAX_30; 3656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.enforceFrameSize = 0; 3666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Invalid value prevents getRedPayload to 3676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin run before encoder is called. */ 3686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.lastBWIdx = -1; 3696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return statusInit; 3706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 3716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic WebRtc_Word16 EncoderInitUb(ISACUBStruct* instUB, 3736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) { 3746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 statusInit = 0; 3756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 3766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Init stream vector to zero. */ 3786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < STREAM_SIZE_MAX_60; k++) { 3796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.bitstr_obj.stream[k] = 0; 3806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitMasking(&instUB->ISACencUB_obj.maskfiltstr_obj); 3836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitPreFilterbank(&instUB->ISACencUB_obj.prefiltbankstr_obj); 3846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth == isac16kHz) { 3866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.buffer_index = LB_TOTAL_DELAY_SAMPLES; 3876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 3886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.buffer_index = 0; 3896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Default for I-mode. */ 3916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.bottleneck = 32000; 3926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* These store the limits for the wideband + super-wideband bit-stream. */ 3936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.maxPayloadSizeBytes = STREAM_SIZE_MAX_30 << 1; 3946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This has to be updated after each lower-band encoding to guarantee 3956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * a correct payload-limitation. */ 3966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.numBytesUsed = 0; 3976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instUB->ISACencUB_obj.data_buffer_float, 0, 3986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (MAX_FRAMESAMPLES + LB_TOTAL_DELAY_SAMPLES) * sizeof(float)); 3996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&(instUB->ISACencUB_obj.lastLPCVec), 4016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kMeanLarUb16, sizeof(double) * UB_LPC_ORDER); 4026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return statusInit; 4046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 4056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4076f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_EncoderInit(ISACStruct* ISAC_main_inst, 4086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 codingMode) { 4096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 4106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 status; 4116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((codingMode != 0) && (codingMode != 1)) { 4136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_DISALLOWED_CODING_MODE; 4146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 4156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Default bottleneck. */ 4176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bottleneck = MAX_ISAC_BW; 4186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacWideband) { 4206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac8kHz; 4216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX_60; 4226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX_30; 4236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 4246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac16kHz; 4256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX; 4266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX; 4276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Channel-adaptive = 0; Instantaneous (Channel-independent) = 1. */ 4306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->codingMode = codingMode; 4316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitBandwidthEstimator(&instISAC->bwestimator_obj, 4336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz, 4346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz); 4356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitRateModel(&instISAC->rate_data_obj); 4376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Default for I-mode. */ 4386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->MaxDelay = 10.0; 4396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = EncoderInitLb(&instISAC->instLB, codingMode, 4416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz); 4426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 4436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -status; 4446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 4456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) { 4486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Initialize encoder filter-bank. */ 4496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->analysisFBState1, 0, 4506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 4516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->analysisFBState2, 0, 4526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 4536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = EncoderInitUb(&(instISAC->instUB), 4556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz); 4566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 4576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -status; 4586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 4596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Initialization is successful, set the flag. */ 4626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->initFlag |= BIT_MASK_ENC_INIT; 4636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 4646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 4656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 4686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_Encode(...) 4696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function encodes 10ms frame(s) and inserts it into a package. 4716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input speech length has to be 160 samples (10ms). The encoder buffers those 4726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 10ms frames until it reaches the chosen Framesize (480 or 960 samples 4736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * corresponding to 30 or 60 ms frames), and then proceeds to the encoding. 4746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 4766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 4776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - speechIn : input speech vector. 4786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 4806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : the encoded data vector 4816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value: 4836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * : >0 - Length (in bytes) of coded data 4846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * : 0 - The buffer didn't reach the chosen 4856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * frameSize so it keeps buffering speech 4866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * samples. 4876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * : -1 - Error 4886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 4896f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_Encode(ISACStruct* ISAC_main_inst, 4906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16* speechIn, 4916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* encoded) { 4926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float inFrame[FRAMESAMPLES_10ms]; 4936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 speechInLB[FRAMESAMPLES_10ms]; 4946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 speechInUB[FRAMESAMPLES_10ms]; 4956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLenLB = 0; 4966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLenUB = 0; 4976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLen = 0; 4986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 k = 0; 4996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord8* ptrEncodedUW8 = (WebRtc_UWord8*)encoded; 5006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int garbageLen = 0; 5016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 bottleneck = 0; 5026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bottleneckIdx = 0; 5036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 jitterInfo = 0; 5046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 5066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACLBStruct* instLB = &(instISAC->instLB); 5076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACUBStruct* instUB = &(instISAC->instUB); 5086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if encoder initiated. */ 5106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 5116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 5126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 5136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 5146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) { 5176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcSpl_AnalysisQMF(speechIn, speechInLB, speechInUB, 5186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->analysisFBState1, 5196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->analysisFBState2); 5206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert from fixed to floating point. */ 5226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_10ms; k++) { 5236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[k] = (float)speechInLB[k]; 5246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 5266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_10ms; k++) { 5276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[k] = (float) speechIn[k]; 5286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Add some noise to avoid denormal numbers. */ 5326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[0] += (float)1.23455334e-3; 5336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[1] -= (float)2.04324239e-3; 5346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[2] += (float)1.90854954e-3; 5356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[9] += (float)1.84854878e-3; 5366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This function will update the bottleneck if required. */ 5386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UpdateBottleneck(instISAC); 5396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get the bandwith information which has to be sent to the other side. */ 5416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin GetSendBandwidthInfo(instISAC, &bottleneckIdx, &jitterInfo); 5426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode lower-band. */ 5446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenLB = WebRtcIsac_EncodeLb(inFrame, &instLB->ISACencLB_obj, 5456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->codingMode, bottleneckIdx); 5466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenLB < 0) { 5476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 5486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) { 5516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB = &(instISAC->instUB); 5526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert to float. */ 5546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_10ms; k++) { 5556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[k] = (float) speechInUB[k]; 5566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Add some noise to avoid denormal numbers. */ 5596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[0] += (float)1.23455334e-3; 5606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[1] -= (float)2.04324239e-3; 5616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[2] += (float)1.90854954e-3; 5626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inFrame[9] += (float)1.84854878e-3; 5636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Tell to upper-band the number of bytes used so far. 5656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This is for payload limitation. */ 5666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.numBytesUsed = streamLenLB + 1 + 5676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LEN_CHECK_SUM_WORD8; 5686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode upper-band. */ 5696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (instISAC->bandwidthKHz) { 5706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: { 5716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = WebRtcIsac_EncodeUb12(inFrame, &instUB->ISACencUB_obj, 5726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin jitterInfo); 5736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 5746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: { 5766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = WebRtcIsac_EncodeUb16(inFrame, &instUB->ISACencUB_obj, 5776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin jitterInfo); 5786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 5796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac8kHz: { 5816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = 0; 5826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 5836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((streamLenUB < 0) && (streamLenUB != -ISAC_PAYLOAD_LARGER_THAN_LIMIT)) { 5876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* An error has happened but this is not the error due to a 5886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream larger than the limit. */ 5896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 5906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenLB == 0) { 5936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 5946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* One byte is allocated for the length. According to older decoders 5976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin so the length bit-stream plus one byte for size and 5986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LEN_CHECK_SUM_WORD8 for the checksum should be less than or equal 5996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin to 255. */ 6006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((streamLenUB > (255 - (LEN_CHECK_SUM_WORD8 + 1))) || 6016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (streamLenUB == -ISAC_PAYLOAD_LARGER_THAN_LIMIT)) { 6026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We have got a too long bit-stream we skip the upper-band 6036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream for this frame. */ 6046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = 0; 6056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ptrEncodedUW8, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB); 6086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLen = streamLenLB; 6096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenUB > 0) { 6106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLenLB] = (WebRtc_UWord8)(streamLenUB + 1 + 6116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LEN_CHECK_SUM_WORD8); 6126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ptrEncodedUW8[streamLenLB + 1], 6136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instUB->ISACencUB_obj.bitstr_obj.stream, streamLenUB); 6146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLen += ptrEncodedUW8[streamLenLB]; 6156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 6166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLenLB] = 0; 6176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 6196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenLB == 0) { 6206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 6216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ptrEncodedUW8, instLB->ISACencLB_obj.bitstr_obj.stream, 6236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenLB); 6246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = 0; 6256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLen = streamLenLB; 6266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Add Garbage if required. */ 6296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetUplinkBandwidth(&instISAC->bwestimator_obj, &bottleneck); 6306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->codingMode == 0) { 6316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int minBytes; 6326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int limit; 6336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord8* ptrGarbage; 6346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->MaxDelay = (double)WebRtcIsac_GetUplinkMaxDelay( 6366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instISAC->bwestimator_obj); 6376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Update rate model and get minimum number of bytes in this packet. */ 6396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin minBytes = WebRtcIsac_GetMinBytes( 6406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &(instISAC->rate_data_obj), streamLen, 6416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.current_framesamples, bottleneck, 6426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->MaxDelay, instISAC->bandwidthKHz); 6436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Make sure MinBytes does not exceed packet size limit. */ 6456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->bandwidthKHz == isac8kHz) { 6466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instLB->ISACencLB_obj.current_framesamples == FRAMESAMPLES) { 6476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin limit = instLB->ISACencLB_obj.payloadLimitBytes30; 6486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 6496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin limit = instLB->ISACencLB_obj.payloadLimitBytes60; 6506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 6526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin limit = instUB->ISACencUB_obj.maxPayloadSizeBytes; 6536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin minBytes = (minBytes > limit) ? limit : minBytes; 6556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Make sure we don't allow more than 255 bytes of garbage data. 6576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * We store the length of the garbage data in 8 bits in the bitstream, 6586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 255 is the max garbage length we can signal using 8 bits. */ 6596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->bandwidthKHz == isac8kHz) || 6606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (streamLenUB == 0)) { 6616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrGarbage = &ptrEncodedUW8[streamLenLB]; 6626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin limit = streamLen + 255; 6636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 6646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrGarbage = &ptrEncodedUW8[streamLenLB + 1 + streamLenUB]; 6656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin limit = streamLen + (255 - ptrEncodedUW8[streamLenLB]); 6666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin minBytes = (minBytes > limit) ? limit : minBytes; 6686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin garbageLen = (minBytes > streamLen) ? (minBytes - streamLen) : 0; 6706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for creation of multiple bit-streams. */ 6726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If bit-stream too short then add garbage at the end. */ 6736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (garbageLen > 0) { 6746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < garbageLen; k++) { 6756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrGarbage[k] = (WebRtc_UWord8)(rand() & 0xFF); 6766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* For a correct length of the upper-band bit-stream together 6786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * with the garbage. Garbage is embeded in upper-band bit-stream. 6796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * That is the only way to preserve backward compatibility. */ 6806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->bandwidthKHz == isac8kHz) || 6816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (streamLenUB == 0)) { 6826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLenLB] = (WebRtc_UWord8)garbageLen; 6836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 6846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLenLB] += (WebRtc_UWord8)garbageLen; 6856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Write the length of the garbage at the end of the upper-band 6866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream, if exists. This helps for sanity check. */ 6876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLenLB + 1 + streamLenUB] = 6886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (WebRtc_UWord8)garbageLen; 6896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLen += garbageLen; 6926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 6946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* update rate model */ 6956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_UpdateRateModel( 6966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instISAC->rate_data_obj, streamLen, 6976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.current_framesamples, bottleneck); 6986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin garbageLen = 0; 6996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Generate CRC if required. */ 7026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->bandwidthKHz != isac8kHz) && (streamLenUB > 0)) { 7036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 crc; 7046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetCrc((WebRtc_Word16*)(&(ptrEncodedUW8[streamLenLB + 1])), 7066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB + garbageLen, &crc); 7076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 7086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) { 7096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLen - LEN_CHECK_SUM_WORD8 + k] = 7106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (WebRtc_UWord8)((crc >> (24 - k * 8)) & 0xFF); 7116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#else 7136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ptrEncodedUW8[streamLenLB + streamLenUB + 1], &crc, 7146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LEN_CHECK_SUM_WORD8); 7156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 7166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return streamLen; 7186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 7196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 7226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_GetNewBitStream(...) 7236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 7246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function returns encoded data, with the recieved bwe-index in the 7256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * stream. If the rate is set to a value less than bottleneck of codec 7266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the new bistream will be re-encoded with the given target rate. 7276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * It should always return a complete packet, i.e. only called once 7286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * even for 60 msec frames. 7296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 7306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * NOTE 1! This function does not write in the ISACStruct, it is not allowed. 7316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * NOTE 3! Rates larger than the bottleneck of the codec will be limited 7326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to the current bottleneck. 7336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 7346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 7356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 7366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - bweIndex : Index of bandwidth estimate to put in new 7376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bitstream 7386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - rate : target rate of the transcoder is bits/sec. 7396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Valid values are the accepted rate in iSAC, 7406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * i.e. 10000 to 56000. 7416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 7426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 7436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : The encoded data vector 7446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 7456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : >0 - Length (in bytes) of coded data 7466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error or called in SWB mode 7476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * NOTE! No error code is written to 7486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the struct since it is only allowed to read 7496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the struct. 7506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 7516f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_GetNewBitStream(ISACStruct* ISAC_main_inst, 7526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bweIndex, 7536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 jitterInfo, 7546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 rate, 7556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* encoded, 7566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 isRCU) { 7576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr iSACBitStreamInst; /* Local struct for bitstream handling */ 7586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLenLB; 7596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLenUB; 7606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 totalStreamLen; 7616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double gain2; 7626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double gain1; 7636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float scale; 7646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth bandwidthKHz; 7656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rateLB; 7666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rateUB; 7676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 currentBN; 7686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord8* encodedPtrUW8 = (WebRtc_UWord8*)encoded; 7696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 crc; 7706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 7716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 k; 7726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 7736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 7746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 7766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 7776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 7786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get the bottleneck of this iSAC and limit the 7816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * given rate to the current bottleneck. */ 7826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetUplinkBw(ISAC_main_inst, ¤tBN); 7836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (rate > currentBN) { 7846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin rate = currentBN; 7856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_RateAllocation(rate, &rateLB, &rateUB, &bandwidthKHz) < 0) { 7886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 7896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Cannot transcode from 16 kHz to 12 kHz. */ 7926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((bandwidthKHz == isac12kHz) && 7936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->bandwidthKHz == isac16kHz)) { 7946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 7956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* A gain [dB] for the given rate. */ 7986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin gain1 = WebRtcIsac_GetSnr( 7996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin rateLB, instISAC->instLB.ISACencLB_obj.current_framesamples); 8006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* The gain [dB] of this iSAC. */ 8016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin gain2 = WebRtcIsac_GetSnr( 8026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.bottleneck, 8036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.current_framesamples); 8046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale is the ratio of two gains in normal domain. */ 8066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin scale = (float)pow(10, (gain1 - gain2) / 20.0); 8076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Change the scale if this is a RCU bit-stream. */ 8086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin scale = (isRCU) ? (scale * RCU_TRANSCODING_SCALE) : scale; 8096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenLB = WebRtcIsac_EncodeStoredDataLb( 8116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instISAC->instLB.ISACencLB_obj.SaveEnc_obj, 8126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &iSACBitStreamInst, bweIndex, scale); 8136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenLB < 0) { 8156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 8166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert from bytes to WebRtc_Word16. */ 8196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(encoded, iSACBitStreamInst.stream, streamLenLB); 8206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidthKHz == isac8kHz) { 8226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return streamLenLB; 8236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin totalStreamLen = streamLenLB; 8266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* super-wideband is always at 30ms. 8276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * These gains are in dB. 8286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Gain for the given rate. */ 8296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin gain1 = WebRtcIsac_GetSnr(rateUB, FRAMESAMPLES); 8306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Gain of this iSAC */ 8316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin gain2 = WebRtcIsac_GetSnr(instISAC->instUB.ISACencUB_obj.bottleneck, 8326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FRAMESAMPLES); 8336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale is the ratio of two gains in normal domain. */ 8356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin scale = (float)pow(10, (gain1 - gain2) / 20.0); 8366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Change the scale if this is a RCU bit-stream. */ 8386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin scale = (isRCU)? (scale * RCU_TRANSCODING_SCALE_UB) : scale; 8396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = WebRtcIsac_EncodeStoredDataUb( 8416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &(instISAC->instUB.ISACencUB_obj.SaveEnc_obj), 8426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &iSACBitStreamInst, jitterInfo, scale, 8436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz); 8446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenUB < 0) { 8466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 8476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenUB + 1 + LEN_CHECK_SUM_WORD8 > 255) { 8506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return streamLenLB; 8516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin totalStreamLen = streamLenLB + streamLenUB + 1 + LEN_CHECK_SUM_WORD8; 8546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encodedPtrUW8[streamLenLB] = streamLenUB + 1 + LEN_CHECK_SUM_WORD8; 8556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&encodedPtrUW8[streamLenLB + 1], iSACBitStreamInst.stream, 8576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB); 8586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetCrc((WebRtc_Word16*)(&(encodedPtrUW8[streamLenLB + 1])), 8606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB, &crc); 8616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 8626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) { 8636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encodedPtrUW8[totalStreamLen - LEN_CHECK_SUM_WORD8 + k] = 8646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (WebRtc_UWord8)((crc >> (24 - k * 8)) & 0xFF); 8656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#else 8676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&encodedPtrUW8[streamLenLB + streamLenUB + 1], &crc, 8686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LEN_CHECK_SUM_WORD8); 8696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 8706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return totalStreamLen; 8716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 8726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 8756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * DecoderInitLb(...) - internal function for initialization of 8766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Lower Band 8776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * DecoderInitUb(...) - internal function for initialization of 8786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Upper Band 8796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DecoderInit(...) - API function 8806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 8816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function initializes a ISAC instance prior to the decoder calls. 8826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 8836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 8846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 8856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 8866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value 8876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * : 0 - Ok 8886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 8896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 8906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic WebRtc_Word16 DecoderInitLb(ISACLBStruct* instISAC) { 8916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int i; 8926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Initialize stream vector to zero. */ 8936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (i = 0; i < STREAM_SIZE_MAX_60; i++) { 8946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->ISACdecLB_obj.bitstr_obj.stream[i] = 0; 8956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitMasking(&instISAC->ISACdecLB_obj.maskfiltstr_obj); 8986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitPostFilterbank( 8996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instISAC->ISACdecLB_obj.postfiltbankstr_obj); 9006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitPitchFilter(&instISAC->ISACdecLB_obj.pitchfiltstr_obj); 9016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 9026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 9036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic WebRtc_Word16 DecoderInitUb(ISACUBStruct* instISAC) { 9056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int i; 9066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Init stream vector to zero */ 9076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (i = 0; i < STREAM_SIZE_MAX_60; i++) { 9086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->ISACdecUB_obj.bitstr_obj.stream[i] = 0; 9096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitMasking(&instISAC->ISACdecUB_obj.maskfiltstr_obj); 9126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitPostFilterbank( 9136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instISAC->ISACdecUB_obj.postfiltbankstr_obj); 9146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return (0); 9156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 9166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9176f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecoderInit(ISACStruct* ISAC_main_inst) { 9186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 9196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (DecoderInitLb(&instISAC->instLB) < 0) { 9216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 9226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->decoderSamplingRateKHz == kIsacSuperWideband) { 9246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->synthesisFBState1, 0, 9256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 9266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->synthesisFBState2, 0, 9276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 9286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (DecoderInitUb(&(instISAC->instUB)) < 0) { 9306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 9316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != BIT_MASK_ENC_INIT) { 9346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_InitBandwidthEstimator(&instISAC->bwestimator_obj, 9356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz, 9366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz); 9376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->initFlag |= BIT_MASK_DEC_INIT; 9396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->resetFlag_8kHz = 0; 9406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 9416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 9426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 9456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_UpdateBwEstimate(...) 9466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 9476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function updates the estimate of the bandwidth. 9486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 9496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 9506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 9516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : encoded ISAC frame(s). 9526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - packet_size : size of the packet. 9536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - rtp_seq_number : the RTP number of the packet. 9546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - arr_ts : the arrival time of the packet (from NetEq) 9556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in samples. 9566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 9576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - Ok 9586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 9596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 9606f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_UpdateBwEstimate(ISACStruct* ISAC_main_inst, 9616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* encoded, 9626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 packet_size, 9636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 rtp_seq_number, 9646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 send_ts, 9656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 arr_ts) { 9666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 9676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr streamdata; 9686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 9696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 9706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 9716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 err; 9726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if decoder initiated. */ 9746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_DEC_INIT) != BIT_MASK_DEC_INIT) { 9756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_DECODER_NOT_INITIATED; 9766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 9776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (packet_size <= 0) { 9806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Return error code if the packet length is null. */ 9816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_EMPTY_PACKET; 9826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 9836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(streamdata)); 9866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 9886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 10; k++) { 9896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamdata.stream[k] = (WebRtc_UWord8)((encoded[k >> 1] >> 9906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ((k & 1) << 3)) & 0xFF); 9916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#else 9936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(streamdata.stream, encoded, 10); 9946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 9956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EstimateBandwidth(&instISAC->bwestimator_obj, &streamdata, 9976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin packet_size, rtp_seq_number, send_ts, 9986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin arr_ts, instISAC->encoderSamplingRateKHz, 9996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz); 10006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 10016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Return error code if something went wrong. */ 10026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -err; 10036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 10046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 10066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 10076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic WebRtc_Word16 Decode(ISACStruct* ISAC_main_inst, 10096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* encoded, 10106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 lenEncodedBytes, 10116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* decoded, 10126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* speechType, 10136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 isRCUPayload) { 10146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Number of samples (480 or 960), output from decoder 10156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin that were actually used in the encoder/decoder 10166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (determined on the fly). */ 10176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numSamplesLB; 10186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numSamplesUB; 10196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 speechIdx; 10206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float outFrame[MAX_FRAMESAMPLES]; 10216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 outFrameLB[MAX_FRAMESAMPLES]; 10226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 outFrameUB[MAX_FRAMESAMPLES]; 10236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numDecodedBytesLB; 10246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numDecodedBytesUB; 10256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 lenEncodedLBBytes; 10266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 validChecksum = 1; 10276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 k; 10286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord8* ptrEncodedUW8 = (WebRtc_UWord8*)encoded; 10296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 numLayer; 10306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 totSizeBytes; 10316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 err; 10326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 10346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACUBDecStruct* decInstUB = &(instISAC->instUB.ISACdecUB_obj); 10356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACLBDecStruct* decInstLB = &(instISAC->instLB.ISACdecLB_obj); 10366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if decoder initiated. */ 10386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_DEC_INIT) != 10396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_DEC_INIT) { 10406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_DECODER_NOT_INITIATED; 10416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 10426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (lenEncodedBytes <= 0) { 10456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* return error code if the packet length is null. */ 10466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_EMPTY_PACKET; 10476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 10486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* The size of the encoded lower-band is bounded by 10516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * STREAM_SIZE_MAX. If a payload with the size larger than STREAM_SIZE_MAX 10526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * is received, it is not considered erroneous. */ 10536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lenEncodedLBBytes = (lenEncodedBytes > STREAM_SIZE_MAX) ? 10546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin STREAM_SIZE_MAX : lenEncodedBytes; 10556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Copy to lower-band bit-stream structure. */ 10576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(instISAC->instLB.ISACdecLB_obj.bitstr_obj.stream, ptrEncodedUW8, 10586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lenEncodedLBBytes); 10596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Regardless of that the current codec is setup to work in 10616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * wideband or super-wideband, the decoding of the lower-band 10626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * has to be performed. */ 10636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numDecodedBytesLB = WebRtcIsac_DecodeLb(outFrame, decInstLB, 10646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &numSamplesLB, isRCUPayload); 10656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((numDecodedBytesLB < 0) || (numDecodedBytesLB > lenEncodedLBBytes) || 10676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (numSamplesLB > MAX_FRAMESAMPLES)) { 10686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_LENGTH_MISMATCH; 10696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 10706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Error Check, we accept multi-layer bit-stream This will limit number 10736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of iterations of the while loop. Even without this the number 10746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of iterations is limited. */ 10756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numLayer = 1; 10766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin totSizeBytes = numDecodedBytesLB; 10776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin while (totSizeBytes != lenEncodedBytes) { 10786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((totSizeBytes > lenEncodedBytes) || 10796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (ptrEncodedUW8[totSizeBytes] == 0) || 10806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (numLayer > MAX_NUM_LAYERS)) { 10816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_LENGTH_MISMATCH; 10826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 10836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin totSizeBytes += ptrEncodedUW8[totSizeBytes]; 10856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numLayer++; 10866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->decoderSamplingRateKHz == kIsacWideband) { 10896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < numSamplesLB; k++) { 10906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (outFrame[k] > 32767) { 10916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decoded[k] = 32767; 10926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (outFrame[k] < -32768) { 10936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decoded[k] = -32768; 10946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 10956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decoded[k] = (WebRtc_Word16)WebRtcIsac_lrint(outFrame[k]); 10966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSamplesUB = 0; 10996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 11006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 crc; 11016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We don't accept larger than 30ms (480 samples at lower-band) 11026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * frame-size. */ 11036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < numSamplesLB; k++) { 11046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (outFrame[k] > 32767) { 11056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrameLB[k] = 32767; 11066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (outFrame[k] < -32768) { 11076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrameLB[k] = -32768; 11086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 11096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrameLB[k] = (WebRtc_Word16)WebRtcIsac_lrint(outFrame[k]); 11106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check for possible error, and if upper-band stream exists. */ 11146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (numDecodedBytesLB == lenEncodedBytes) { 11156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decoding was successful. No super-wideband bit-stream exists. */ 11166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSamplesUB = numSamplesLB; 11176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(outFrameUB, 0, sizeof(WebRtc_Word16) * numSamplesUB); 11186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Prepare for the potential increase of signal bandwidth. */ 11206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->resetFlag_8kHz = 2; 11216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 11226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This includes the checksum and the bytes that stores the length. */ 11236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 lenNextStream = ptrEncodedUW8[numDecodedBytesLB]; 11246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Is this garbage or valid super-wideband bit-stream? 11266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Check if checksum is valid. */ 11276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (lenNextStream <= (LEN_CHECK_SUM_WORD8 + 1)) { 11286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Such a small second layer cannot be super-wideband layer. 11296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * It must be a short garbage. */ 11306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin validChecksum = 0; 11316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 11326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Run CRC to see if the checksum match. */ 11336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetCrc((WebRtc_Word16*)( 11346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ptrEncodedUW8[numDecodedBytesLB + 1]), 11356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lenNextStream - LEN_CHECK_SUM_WORD8 - 1, &crc); 11366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin validChecksum = 1; 11386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) { 11396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin validChecksum &= (((crc >> (24 - k * 8)) & 0xFF) == 11406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[numDecodedBytesLB + lenNextStream - 11416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LEN_CHECK_SUM_WORD8 + k]); 11426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (!validChecksum) { 11466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This is a garbage, we have received a wideband 11476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream with garbage. */ 11486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSamplesUB = numSamplesLB; 11496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(outFrameUB, 0, sizeof(WebRtc_Word16) * numSamplesUB); 11506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 11516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* A valid super-wideband biststream exists. */ 11526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth bandwidthKHz; 11536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 maxDelayBit; 11546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If we have super-wideband bit-stream, we cannot 11566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * have 60 ms frame-size. */ 11576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (numSamplesLB > FRAMESAMPLES) { 11586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_LENGTH_MISMATCH; 11596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 11606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* The rest of the bit-stream contains the upper-band 11636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream curently this is the only thing there, 11646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * however, we might add more layers. */ 11656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Have to exclude one byte where the length is stored 11676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * and last 'LEN_CHECK_SUM_WORD8' bytes where the 11686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * checksum is stored. */ 11696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lenNextStream -= (LEN_CHECK_SUM_WORD8 + 1); 11706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(decInstUB->bitstr_obj.stream, 11726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ptrEncodedUW8[numDecodedBytesLB + 1], lenNextStream); 11736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Reset bit-stream object, this is the first decoding. */ 11756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(decInstUB->bitstr_obj)); 11766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decode jitter information. */ 11786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecodeJitterInfo(&decInstUB->bitstr_obj, &maxDelayBit); 11796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 11806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -err; 11816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 11826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Update jitter info which is in the upper-band bit-stream 11856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * only if the encoder is in super-wideband. Otherwise, 11866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the jitter info is already embedded in bandwidth index 11876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * and has been updated. */ 11886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) { 11896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_UpdateUplinkJitter( 11906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &(instISAC->bwestimator_obj), maxDelayBit); 11916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 11926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -err; 11936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 11946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decode bandwidth information. */ 11986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecodeBandwidth(&decInstUB->bitstr_obj, 11996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &bandwidthKHz); 12006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 12016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -err; 12026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 12036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (bandwidthKHz) { 12066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: { 12076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numDecodedBytesUB = WebRtcIsac_DecodeUb12(outFrame, decInstUB, 12086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin isRCUPayload); 12096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Hang-over for transient alleviation - 12116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * wait two frames to add the upper band going up from 8 kHz. */ 12126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->resetFlag_8kHz > 0) { 12136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->resetFlag_8kHz == 2) { 12146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Silence first and a half frame. */ 12156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(outFrame, 0, MAX_FRAMESAMPLES * 12166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(float)); 12176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 12186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const float rampStep = 2.0f / MAX_FRAMESAMPLES; 12196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float rampVal = 0; 12206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(outFrame, 0, (MAX_FRAMESAMPLES >> 1) * 12216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(float)); 12226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Ramp up second half of second frame. */ 12246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = MAX_FRAMESAMPLES / 2; k < MAX_FRAMESAMPLES; k++) { 12256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrame[k] *= rampVal; 12266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin rampVal += rampStep; 12276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->resetFlag_8kHz -= 1; 12306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 12336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: { 12356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numDecodedBytesUB = WebRtcIsac_DecodeUb16(outFrame, decInstUB, 12366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin isRCUPayload); 12376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 12386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 12406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 12416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* It might be less due to garbage. */ 12446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((numDecodedBytesUB != lenNextStream) && 12456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (numDecodedBytesUB != (lenNextStream - 12466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[numDecodedBytesLB + 1 + numDecodedBytesUB]))) { 12476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_LENGTH_MISMATCH; 12486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 12496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If there is no error Upper-band always decodes 12526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 30 ms (480 samples). */ 12536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSamplesUB = FRAMESAMPLES; 12546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert to W16. */ 12566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < numSamplesUB; k++) { 12576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (outFrame[k] > 32767) { 12586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrameUB[k] = 32767; 12596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (outFrame[k] < -32768) { 12606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrameUB[k] = -32768; 12616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 12626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrameUB[k] = (WebRtc_Word16)WebRtcIsac_lrint( 12636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outFrame[k]); 12646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin speechIdx = 0; 12706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin while (speechIdx < numSamplesLB) { 12716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcSpl_SynthesisQMF(&outFrameLB[speechIdx], &outFrameUB[speechIdx], 12726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &decoded[(speechIdx << 1)], 12736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->synthesisFBState1, 12746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->synthesisFBState2); 12756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin speechIdx += FRAMESAMPLES_10ms; 12776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *speechType = 0; 12806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return (numSamplesLB + numSamplesUB); 12816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 12826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 12906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_Decode(...) 12916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 12926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function decodes a ISAC frame. Output speech length 12936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * will be a multiple of 480 samples: 480 or 960 samples, 12946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * depending on the frameSize (30 or 60 ms). 12956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 12966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 12976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 12986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : encoded ISAC frame(s) 12996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - len : bytes in encoded vector 13006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 13026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - decoded : The decoded vector 13036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : >0 - number of samples in decoded vector 13056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 13066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 13076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13086f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_Decode(ISACStruct* ISAC_main_inst, 13096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* encoded, 13106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 lenEncodedBytes, 13116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* decoded, 13126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* speechType) { 13136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 isRCUPayload = 0; 13146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return Decode(ISAC_main_inst, encoded, lenEncodedBytes, decoded, 13156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin speechType, isRCUPayload); 13166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 13176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 13196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DecodeRcu(...) 13206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function decodes a redundant (RCU) iSAC frame. Function is called in 13226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * NetEq with a stored RCU payload in case of packet loss. Output speech length 13236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * will be a multiple of 480 samples: 480 or 960 samples, 13246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * depending on the framesize (30 or 60 ms). 13256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 13276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 13286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : encoded ISAC RCU frame(s) 13296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - len : bytes in encoded vector 13306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 13326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - decoded : The decoded vector 13336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : >0 - number of samples in decoded vector 13356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 13366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 13376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13406f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecodeRcu(ISACStruct* ISAC_main_inst, 13416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* encoded, 13426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 lenEncodedBytes, 13436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* decoded, 13446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* speechType) { 13456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 isRCUPayload = 1; 13466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return Decode(ISAC_main_inst, encoded, lenEncodedBytes, decoded, 13476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin speechType, isRCUPayload); 13486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 13496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 13526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DecodePlc(...) 13536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function conducts PLC for ISAC frame(s). Output speech length 13556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * will be a multiple of 480 samples: 480 or 960 samples, 13566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * depending on the frameSize (30 or 60 ms). 13576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 13596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 13606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - noOfLostFrames : Number of PLC frames to produce 13616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 13636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - decoded : The decoded vector 13646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 13656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : >0 - number of samples in decoded PLC vector 13666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 13676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 13686f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecodePlc(ISACStruct* ISAC_main_inst, 13696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* decoded, 13706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 noOfLostFrames) { 13716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numSamples = 0; 13726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 13736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Limit number of frames to two = 60 millisecond. 13756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Otherwise we exceed data vectors. */ 13766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (noOfLostFrames > 2) { 13776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin noOfLostFrames = 2; 13786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get the number of samples per frame */ 13816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (instISAC->decoderSamplingRateKHz) { 13826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacWideband: { 13836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSamples = 480 * noOfLostFrames; 13846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 13856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacSuperWideband: { 13876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSamples = 960 * noOfLostFrames; 13886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 13896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Set output samples to zero. */ 13936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(decoded, 0, numSamples * sizeof(WebRtc_Word16)); 13946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return numSamples; 13956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 13966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 13996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * ControlLb(...) - Internal function for controlling Lower Band 14006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * ControlUb(...) - Internal function for controlling Upper Band 14016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_Control(...) - API function 14026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 14036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function sets the limit on the short-term average bit rate and the 14046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * frame length. Should be used only in Instantaneous mode. 14056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 14066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 14076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 14086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - rate : limit on the short-term average bit rate, 14096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in bits/second (between 10000 and 32000) 14106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - frameSize : number of milliseconds per frame (30 or 60) 14116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 14126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - ok 14136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 14146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 14156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic WebRtc_Word16 ControlLb(ISACLBStruct* instISAC, double rate, 14166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 frameSize) { 14176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((rate >= 10000) && (rate <= 32000)) { 14186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->ISACencLB_obj.bottleneck = rate; 14196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 14206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_DISALLOWED_BOTTLENECK; 14216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((frameSize == 30) || (frameSize == 60)) { 14246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->ISACencLB_obj.new_framelength = (FS / 1000) * frameSize; 14256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 14266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_DISALLOWED_FRAME_LENGTH; 14276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 14306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 14316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic WebRtc_Word16 ControlUb(ISACUBStruct* instISAC, double rate) { 14336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((rate >= 10000) && (rate <= 32000)) { 14346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->ISACencUB_obj.bottleneck = rate; 14356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 14366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_DISALLOWED_BOTTLENECK; 14376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 14396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 14406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14416f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_Control(ISACStruct* ISAC_main_inst, 14426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 bottleneckBPS, 14436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 frameSize) { 14446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 14456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 status; 14466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rateLB; 14476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rateUB; 14486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth bandwidthKHz; 14496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->codingMode == 0) { 14516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* In adaptive mode. */ 14526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_MODE_MISMATCH; 14536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 14546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if encoder initiated */ 14576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 14586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 14596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 14606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 14616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacWideband) { 14646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If the sampling rate is 16kHz then bandwith should be 8kHz, 14656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * regardless of bottleneck. */ 14666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bandwidthKHz = isac8kHz; 14676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin rateLB = (bottleneckBPS > 32000) ? 32000 : bottleneckBPS; 14686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin rateUB = 0; 14696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 14706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_RateAllocation(bottleneckBPS, &rateLB, &rateUB, 14716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &bandwidthKHz) < 0) { 14726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 14736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->encoderSamplingRateKHz == kIsacSuperWideband) && 14776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (frameSize != 30) && 14786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (bandwidthKHz != isac8kHz)) { 14796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Cannot have 60 ms in super-wideband. */ 14806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_DISALLOWED_FRAME_LENGTH; 14816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 14826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = ControlLb(&instISAC->instLB, rateLB, frameSize); 14856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 14866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -status; 14876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 14886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidthKHz != isac8kHz) { 14906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = ControlUb(&(instISAC->instUB), rateUB); 14916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 14926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -status; 14936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 14946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if bandwidth is changing from wideband to super-wideband 14996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * then we have to synch data buffer of lower & upper-band. Also 15006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * clean up the upper-band data buffer. */ 15016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->bandwidthKHz == isac8kHz) && (bandwidthKHz != isac8kHz)) { 15036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->instUB.ISACencUB_obj.data_buffer_float, 0, 15046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(float) * (MAX_FRAMESAMPLES + LB_TOTAL_DELAY_SAMPLES)); 15056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidthKHz == isac12kHz) { 15076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instUB.ISACencUB_obj.buffer_index = 15086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.buffer_index; 15096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 15106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instUB.ISACencUB_obj.buffer_index = 15116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LB_TOTAL_DELAY_SAMPLES + instISAC->instLB.ISACencLB_obj.buffer_index; 15126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&(instISAC->instUB.ISACencUB_obj.lastLPCVec), 15146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kMeanLarUb16, sizeof(double) * UB_LPC_ORDER); 15156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Update the payload limit if the bandwidth is changing. */ 15196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->bandwidthKHz != bandwidthKHz) { 15206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = bandwidthKHz; 15216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UpdatePayloadSizeLimit(instISAC); 15226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bottleneck = bottleneckBPS; 15246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 15256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 15266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 15296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_ControlBwe(...) 15306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 15316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function sets the initial values of bottleneck and frame-size if 15326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * iSAC is used in channel-adaptive mode. Through this API, users can 15336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * enforce a frame-size for all values of bottleneck. Then iSAC will not 15346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * automatically change the frame-size. 15356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 15366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 15376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 15386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance. 15396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - rateBPS : initial value of bottleneck in bits/second 15406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 10000 <= rateBPS <= 32000 is accepted 15416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * For default bottleneck set rateBPS = 0 15426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - frameSizeMs : number of milliseconds per frame (30 or 60) 15436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - enforceFrameSize : 1 to enforce the given frame-size through out 15446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the adaptation process, 0 to let iSAC change 15456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the frame-size if required. 15466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 15476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - ok 15486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - Error 15496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 15506f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_ControlBwe(ISACStruct* ISAC_main_inst, 15516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 bottleneckBPS, 15526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 frameSizeMs, 15536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 enforceFrameSize) { 15546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 15556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth bandwidth; 15566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if encoder initiated */ 15586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 15596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 15606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 15616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 15626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check that we are in channel-adaptive mode, otherwise, return (-1) */ 15656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->codingMode != 0) { 15666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_MODE_MISMATCH; 15676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 15686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((frameSizeMs != 30) && 15706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->encoderSamplingRateKHz == kIsacSuperWideband)) { 15716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 15726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Set structure variable if enforceFrameSize is set. ISAC will then 15756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * keep the chosen frame size. */ 15766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (enforceFrameSize != 0) { 15776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.enforceFrameSize = 1; 15786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 15796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.enforceFrameSize = 0; 15806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Set the initial rate. If the input value is zero then the default intial 15836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * rate is used. Otehrwise, values between 10 to 32 kbps are accepted. */ 15846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bottleneckBPS != 0) { 15856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rateLB; 15866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rateUB; 15876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_RateAllocation(bottleneckBPS, &rateLB, &rateUB, 15886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &bandwidth) < 0) { 15896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 15906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bwestimator_obj.send_bw_avg = (float)bottleneckBPS; 15926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = bandwidth; 15936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Set the initial frame-size. If 'enforceFrameSize' is set, the frame-size 15966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * will not change */ 15976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (frameSizeMs != 0) { 15986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((frameSizeMs == 30) || (frameSizeMs == 60)) { 15996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.new_framelength = (FS / 1000) * 16006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin frameSizeMs; 16016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 16026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_DISALLOWED_FRAME_LENGTH; 16036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 16046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 16076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 16086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 16116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_GetDownLinkBwIndex(...) 16126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function returns index representing the Bandwidth estimate from 16146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the other side to this side. 16156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 16176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC structure 16186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 16206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - bweIndex : Bandwidth estimate to transmit to other side. 16216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 16236f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_GetDownLinkBwIndex(ISACStruct* ISAC_main_inst, 16246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* bweIndex, 16256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* jitterInfo) { 16266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 16276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if encoder initialized. */ 16296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_DEC_INIT) != 16306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_DEC_INIT) { 16316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 16326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 16336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Call function to get Bandwidth Estimate. */ 16366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetDownlinkBwJitIndexImpl(&(instISAC->bwestimator_obj), bweIndex, 16376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin jitterInfo, 16386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz); 16396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 16406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 16416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 16446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_UpdateUplinkBw(...) 16456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function takes an index representing the Bandwidth estimate from 16476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * this side to other side and updates BWE. 16486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 16506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC structure 16516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - rateIndex : Bandwidth estimate from other side. 16526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 - ok 16546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 - index out of range 16556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 16566f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_UpdateUplinkBw(ISACStruct* ISAC_main_inst, 16576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bweIndex) { 16586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 16596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 returnVal; 16606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if encoder initiated. */ 16626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 16636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 16646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 16656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 16666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Call function to get Bandwidth Estimate. */ 16696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin returnVal = WebRtcIsac_UpdateUplinkBwImpl( 16706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &(instISAC->bwestimator_obj), bweIndex, 16716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz); 16726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (returnVal < 0) { 16746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = -returnVal; 16756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 16766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 16776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 16786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 16806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 16836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_ReadBwIndex(...) 16846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function returns the index of the Bandwidth estimate from the 16866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream. 16876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 16896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : Encoded bit-stream 16906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 16926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - frameLength : Length of frame in packet (in samples) 16936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - bweIndex : Bandwidth estimate in bit-stream 16946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 16956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 16966f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_ReadBwIndex(const WebRtc_Word16* encoded, 16976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* bweIndex) { 16986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr streamdata; 16996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 17006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 17016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 17026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 err; 17036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(streamdata)); 17056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 17076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 10; k++) { 17086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamdata.stream[k] = (WebRtc_UWord8)((encoded[k >> 1] >> 17096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ((k & 1) << 3)) & 0xFF); 17106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#else 17126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(streamdata.stream, encoded, 10); 17136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 17146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decode frame length. */ 17166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecodeFrameLen(&streamdata, bweIndex); 17176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 17186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 17196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decode BW estimation. */ 17226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecodeSendBW(&streamdata, bweIndex); 17236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 17246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 17256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 17286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 17296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 17326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_ReadFrameLen(...) 17336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function returns the length of the frame represented in the packet. 17356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 17376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : Encoded bitstream 17386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 17406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - frameLength : Length of frame in packet (in samples) 17416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 17436f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_ReadFrameLen(ISACStruct* ISAC_main_inst, 17446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16* encoded, 17456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* frameLength) { 17466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr streamdata; 17476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 17486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 17496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 17506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 err; 17516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC; 17526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(streamdata)); 17546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 17566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 10; k++) { 17576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamdata.stream[k] = (WebRtc_UWord8)((encoded[k >> 1] >> 17586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ((k & 1) << 3)) & 0xFF); 17596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#else 17616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(streamdata.stream, encoded, 10); 17626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 17636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decode frame length. */ 17656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecodeFrameLen(&streamdata, frameLength); 17666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 17676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 17686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC = (ISACMainStruct*)ISAC_main_inst; 17706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->decoderSamplingRateKHz == kIsacSuperWideband) { 17726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* The decoded frame length indicates the number of samples in 17736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * lower-band in this case, multiply by 2 to get the total number 17746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of samples. */ 17756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *frameLength <<= 1; 17766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 17786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 17796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/******************************************************************************* 17826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_GetNewFrameLen(...) 17836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function returns the frame length (in samples) of the next packet. 17856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * In the case of channel-adaptive mode, iSAC decides on its frame length based 17866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * on the estimated bottleneck, this AOI allows a user to prepare for the next 17876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * packet (at the encoder). 17886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * The primary usage is in CE to make the iSAC works in channel-adaptive mode 17906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 17926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC struct 17936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return Value : frame lenght in samples 17956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 17966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 17976f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_GetNewFrameLen(ISACStruct* ISAC_main_inst) { 17986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 17996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Return new frame length. */ 18016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacWideband) { 18026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return (instISAC->instLB.ISACencLB_obj.new_framelength); 18036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 18046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return ((instISAC->instLB.ISACencLB_obj.new_framelength) << 1); 18056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 18066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 18076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 18106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_GetErrorCode(...) 18116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function can be used to check the error code of an iSAC instance. 18136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * When a function returns -1 an error code will be set for that instance. 18146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * The function below extracts the code of the last error that occurred in 18156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the specified instance. 18166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 18186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : ISAC instance 18196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : Error code 18216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 18226f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_GetErrorCode(ISACStruct* ISAC_main_inst) { 18236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return ((ISACMainStruct*)ISAC_main_inst)->errorCode; 18246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 18256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 18286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_GetUplinkBw(...) 18296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function outputs the target bottleneck of the codec. In 18316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * channel-adaptive mode, the target bottleneck is specified through an in-band 18326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * signalling retrieved by bandwidth estimator. 18336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * In channel-independent, also called instantaneous mode, the target 18346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bottleneck is provided to the encoder by calling xxx_control(...) (if 18356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * xxx_control is never called, the default values are used.). 18366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Note that the output is the iSAC internal operating bottleneck which might 18376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * differ slightly from the one provided through xxx_control(). 18386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 18406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC instance 18416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 18436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - *bottleneck : bottleneck in bits/sec 18446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : -1 if error happens 18466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 0 bit-rates computed correctly. 18476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 18486f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_GetUplinkBw(ISACStruct* ISAC_main_inst, 18496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32* bottleneck) { 18506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 18516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->codingMode == 0) { 18536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We are in adaptive mode then get the bottleneck from BWE. */ 18546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bottleneck = (WebRtc_Word32)instISAC->bwestimator_obj.send_bw_avg; 18556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 18566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bottleneck = instISAC->bottleneck; 18576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 18586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((*bottleneck > 32000) && (*bottleneck < 38000)) { 18606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bottleneck = 32000; 18616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if ((*bottleneck > 45000) && (*bottleneck < 50000)) { 18626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bottleneck = 45000; 18636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (*bottleneck > 56000) { 18646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bottleneck = 56000; 18656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 18666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 18676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 18686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 18716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_SetMaxPayloadSize(...) 18726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function sets a limit for the maximum payload size of iSAC. The same 18746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * value is used both for 30 and 60 ms packets. If the encoder sampling rate 18756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * is 16 kHz the maximum payload size is between 120 and 400 bytes. If the 18766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * encoder sampling rate is 32 kHz the maximum payload size is between 120 18776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * and 600 bytes. 18786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * --------------- 18806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * IMPORTANT NOTES 18816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * --------------- 18826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * The size of a packet is limited to the minimum of 'max-payload-size' and 18836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 'max-rate.' For instance, let's assume the max-payload-size is set to 18846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps 18856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms 18866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * frame-size. Then a packet with a frame-size of 30 ms is limited to 150, 18876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to 18886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 170 bytes, i.e. min(170, 300). 18896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 18916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC instance 18926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - maxPayloadBytes : maximum size of the payload in bytes 18936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * valid values are between 100 and 400 bytes 18946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * if encoder sampling rate is 16 kHz. For 18956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 32 kHz encoder sampling rate valid values 18966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * are between 100 and 600 bytes. 18976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 18986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 if successful 18996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 if error happens 19006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 19016f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_SetMaxPayloadSize(ISACStruct* ISAC_main_inst, 19026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 maxPayloadBytes) { 19036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 19046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 status = 0; 19056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check if encoder initiated */ 19076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 19086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 19096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 19106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 19116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) { 19146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Sanity check. */ 19156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxPayloadBytes < 120) { 19166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 'maxRate' is out of valid range 19176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * set to the acceptable value and return -1. */ 19186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxPayloadBytes = 120; 19196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 19206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* sanity check */ 19236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxPayloadBytes > STREAM_SIZE_MAX) { 19246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* maxRate is out of valid range, 19256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * set to the acceptable value and return -1. */ 19266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxPayloadBytes = STREAM_SIZE_MAX; 19276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 19286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 19306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxPayloadBytes < 120) { 19316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Max payload-size is out of valid range 19326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * set to the acceptable value and return -1. */ 19336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxPayloadBytes = 120; 19346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 19356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxPayloadBytes > STREAM_SIZE_MAX_60) { 19376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Max payload-size is out of valid range 19386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * set to the acceptable value and return -1. */ 19396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxPayloadBytes = STREAM_SIZE_MAX_60; 19406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 19416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxPayloadSizeBytes = maxPayloadBytes; 19446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UpdatePayloadSizeLimit(instISAC); 19456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 19466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 19476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 19506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_SetMaxRate(...) 19516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 19526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function sets the maximum rate which the codec may not exceed for 19536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * any signal packet. The maximum rate is defined and payload-size per 19546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * frame-size in bits per second. 19556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 19566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * The codec has a maximum rate of 53400 bits per second (200 bytes per 30 19576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * ms) if the encoder sampling rate is 16kHz, and 160 kbps (600 bytes/30 ms) 19586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * if the encoder sampling rate is 32 kHz. 19596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 19606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * It is possible to set a maximum rate between 32000 and 53400 bits/sec 19616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in wideband mode, and 32000 to 160000 bits/sec in super-wideband mode. 19626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 19636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * --------------- 19646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * IMPORTANT NOTES 19656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * --------------- 19666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * The size of a packet is limited to the minimum of 'max-payload-size' and 19676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 'max-rate.' For instance, let's assume the max-payload-size is set to 19686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps 19696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms 19706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * frame-size. Then a packet with a frame-size of 30 ms is limited to 150, 19716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to 19726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 170 bytes, min(170, 300). 19736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 19746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 19756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC instance 19766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - maxRate : maximum rate in bits per second, 19776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * valid values are 32000 to 53400 bits/sec in 19786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * wideband mode, and 32000 to 160000 bits/sec in 19796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * super-wideband mode. 19806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 19816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 if successful 19826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 if error happens 19836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 19846f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_SetMaxRate(ISACStruct* ISAC_main_inst, 19856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 maxRate) { 19866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 19876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 maxRateInBytesPer30Ms; 19886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 status = 0; 19896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* check if encoder initiated */ 19916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != BIT_MASK_ENC_INIT) { 19926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 19936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 19946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Calculate maximum number of bytes per 30 msec packets for the 19966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin given maximum rate. Multiply with 30/1000 to get number of 19976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bits per 30 ms, divide by 8 to get number of bytes per 30 ms: 19986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxRateInBytes = floor((maxRate * 30/1000) / 8); */ 19996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxRateInBytesPer30Ms = (WebRtc_Word16)(maxRate * 3 / 800); 20006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->encoderSamplingRateKHz == kIsacWideband) { 20026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxRate < 32000) { 20036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 'maxRate' is out of valid range. 20046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Set to the acceptable value and return -1. */ 20056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxRateInBytesPer30Ms = 120; 20066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 20076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxRate > 53400) { 20106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 'maxRate' is out of valid range. 20116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Set to the acceptable value and return -1. */ 20126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxRateInBytesPer30Ms = 200; 20136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 20146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 20166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxRateInBytesPer30Ms < 120) { 20176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 'maxRate' is out of valid range 20186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Sset to the acceptable value and return -1. */ 20196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxRateInBytesPer30Ms = 120; 20206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 20216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (maxRateInBytesPer30Ms > STREAM_SIZE_MAX) { 20246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 'maxRate' is out of valid range. 20256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Set to the acceptable value and return -1. */ 20266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin maxRateInBytesPer30Ms = STREAM_SIZE_MAX; 20276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = -1; 20286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxRateBytesPer30Ms = maxRateInBytesPer30Ms; 20316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UpdatePayloadSizeLimit(instISAC); 20326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 20336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 20346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 20376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_GetRedPayload(...) 20386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 20396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function populates "encoded" with the redundant payload of the recently 20406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * encodedframe. This function has to be called once that WebRtcIsac_Encode(...) 20416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * returns a positive value. Regardless of the frame-size this function will 20426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * be called only once after encoding is completed. The bit-stream is 20436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * targeted for 16000 bit/sec. 20446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 20456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 20466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC struct 20476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 20486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 20496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - encoded : the encoded data vector 20506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 20516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 20526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : >0 - Length (in bytes) of coded data 20536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * : -1 - Error 20546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 20556f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_GetRedPayload(ISACStruct* ISAC_main_inst, 20566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* encoded) { 20576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr iSACBitStreamInst; 20586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLenLB; 20596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLenUB; 20606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 streamLen; 20616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 totalLenUB; 20626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord8* ptrEncodedUW8 = (WebRtc_UWord8*)encoded; 20636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 20646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 20656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 20666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 20676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 20696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 20706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED; 20716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(iSACBitStreamInst)); 20746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenLB = WebRtcIsac_EncodeStoredDataLb( 20766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instISAC->instLB.ISACencLB_obj.SaveEnc_obj, 20776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &iSACBitStreamInst, 20786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->instLB.ISACencLB_obj.lastBWIdx, 20796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin RCU_TRANSCODING_SCALE); 20806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenLB < 0) { 20816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 20826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* convert from bytes to WebRtc_Word16. */ 20856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ptrEncodedUW8, iSACBitStreamInst.stream, streamLenLB); 20866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLen = streamLenLB; 20876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->bandwidthKHz == isac8kHz) { 20886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return streamLenLB; 20896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = WebRtcIsac_GetRedPayloadUb( 20926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &instISAC->instUB.ISACencUB_obj.SaveEnc_obj, 20936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &iSACBitStreamInst, instISAC->bandwidthKHz); 20946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (streamLenUB < 0) { 20956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* An error has happened but this is not the error due to a 20966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bit-stream larger than the limit. */ 20976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 20986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We have one byte to write the total length of the upper-band. 21016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * The length includes the bit-stream length, check-sum and the 21026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * single byte where the length is written to. This is according to 21036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * iSAC wideband and how the "garbage" is dealt. */ 21046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin totalLenUB = streamLenUB + 1 + LEN_CHECK_SUM_WORD8; 21056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (totalLenUB > 255) { 21066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB = 0; 21076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 21086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Generate CRC if required. */ 21106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->bandwidthKHz != isac8kHz) && 21116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (streamLenUB > 0)) { 21126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 crc; 21136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLen += totalLenUB; 21146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLenLB] = (WebRtc_UWord8)totalLenUB; 21156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ptrEncodedUW8[streamLenLB + 1], iSACBitStreamInst.stream, 21166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB); 21176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetCrc((WebRtc_Word16*)(&(ptrEncodedUW8[streamLenLB + 1])), 21196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin streamLenUB, &crc); 21206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#ifndef WEBRTC_BIG_ENDIAN 21216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) { 21226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrEncodedUW8[streamLen - LEN_CHECK_SUM_WORD8 + k] = 21236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (WebRtc_UWord8)((crc >> (24 - k * 8)) & 0xFF); 21246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 21256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#else 21266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ptrEncodedUW8[streamLenLB + streamLenUB + 1], &crc, 21276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LEN_CHECK_SUM_WORD8); 21286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#endif 21296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 21306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return streamLen; 21316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 21326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/**************************************************************************** 21356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_version(...) 21366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 21376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function returns the version number. 21386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 21396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 21406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - version : Pointer to character string 21416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 21426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 21436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_version(char* version) { 21446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin strcpy(version, "4.3.0"); 21456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 21466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 21496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_SetEncSampRate() 21506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function sets the sampling rate of the encoder. Initialization of the 21516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * encoder WILL NOT overwrite the sampling rate of the encoder. The default 21526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * value is 16 kHz which is set when the instance is created. The encoding-mode 21536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * and the bottleneck remain unchanged by this call, however, the maximum rate 21546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * and maximum payload-size will be reset to their default values. 21556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 21566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 21576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC instance 21586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - sampRate : enumerator specifying the sampling rate. 21596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 21606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 if successful 21616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 if failed. 21626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 21636f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_SetEncSampRate(ISACStruct* ISAC_main_inst, 21646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum IsacSamplingRate sampRate) { 21656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 21666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((sampRate != kIsacWideband) && 21686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (sampRate != kIsacSuperWideband)) { 21696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Sampling Frequency is not supported. */ 21706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_UNSUPPORTED_SAMPLING_FREQUENCY; 21716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 21726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != 21736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin BIT_MASK_ENC_INIT) { 21746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (sampRate == kIsacWideband) { 21756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac8kHz; 21766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 21776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac16kHz; 21786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 21796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz = sampRate; 21806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 21816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 21826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACUBStruct* instUB = &(instISAC->instUB); 21836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACLBStruct* instLB = &(instISAC->instLB); 21846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double bottleneckLB; 21856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double bottleneckUB; 21866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 bottleneck = instISAC->bottleneck; 21876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 codingMode = instISAC->codingMode; 21886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 frameSizeMs = instLB->ISACencLB_obj.new_framelength / 21896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (FS / 1000); 21906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 21916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((sampRate == kIsacWideband) && 21926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->encoderSamplingRateKHz == kIsacSuperWideband)) { 21936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Changing from super-wideband to wideband. 21946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * we don't need to re-initialize the encoder of the lower-band. */ 21956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac8kHz; 21966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (codingMode == 1) { 21976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ControlLb(instLB, 21986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (bottleneck > 32000) ? 32000 : bottleneck, FRAMESIZE); 21996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX_60; 22016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX_30; 22026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if ((sampRate == kIsacSuperWideband) && 22036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->encoderSamplingRateKHz == kIsacWideband)) { 22046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (codingMode == 1) { 22056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_RateAllocation(bottleneck, &bottleneckLB, &bottleneckUB, 22066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &(instISAC->bandwidthKHz)); 22076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bandwidthKHz = isac16kHz; 22106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX; 22116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX; 22126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin EncoderInitLb(instLB, codingMode, sampRate); 22146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin EncoderInitUb(instUB, instISAC->bandwidthKHz); 22156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->analysisFBState1, 0, 22176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 22186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->analysisFBState2, 0, 22196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 22206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (codingMode == 1) { 22226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->bottleneck = bottleneck; 22236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ControlLb(instLB, bottleneckLB, 22246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (instISAC->bandwidthKHz == isac8kHz) ? frameSizeMs:FRAMESIZE); 22256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (instISAC->bandwidthKHz > isac8kHz) { 22266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ControlUb(instUB, bottleneckUB); 22276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 22296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.enforceFrameSize = 0; 22306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instLB->ISACencLB_obj.new_framelength = FRAMESAMPLES; 22316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->encoderSamplingRateKHz = sampRate; 22346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 22356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 22376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 22406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_SetDecSampRate() 22416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This function sets the sampling rate of the decoder. Initialization of the 22426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * decoder WILL NOT overwrite the sampling rate of the encoder. The default 22436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * value is 16 kHz which is set when the instance is created. 22446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 22456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 22466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC instance 22476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - sampRate : enumerator specifying the sampling rate. 22486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 22496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 if successful 22506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 if failed. 22516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 22526f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_SetDecSampRate(ISACStruct* ISAC_main_inst, 22536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum IsacSamplingRate sampRate) { 22546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 22556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((sampRate != kIsacWideband) && 22576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (sampRate != kIsacSuperWideband)) { 22586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Sampling Frequency is not supported. */ 22596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->errorCode = ISAC_UNSUPPORTED_SAMPLING_FREQUENCY; 22606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 22616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 22626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((instISAC->decoderSamplingRateKHz == kIsacWideband) && 22636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (sampRate == kIsacSuperWideband)) { 22646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Switching from wideband to super-wideband at the decoder 22656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * we need to reset the filter-bank and initialize upper-band decoder. */ 22666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->synthesisFBState1, 0, 22676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 22686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(instISAC->synthesisFBState2, 0, 22696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FB_STATE_SIZE_WORD32 * sizeof(WebRtc_Word32)); 22706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (DecoderInitUb(&(instISAC->instUB)) < 0) { 22726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 22736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin instISAC->decoderSamplingRateKHz = sampRate; 22766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 22776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 22786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 22796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 22826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_EncSampRate() 22836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 22846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 22856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC instance 22866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 22876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : enumerator representing sampling frequency 22886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * associated with the encoder, the input audio 22896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * is expected to be sampled at this rate. 22906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 22916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 22926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinenum IsacSamplingRate WebRtcIsac_EncSampRate(ISACStruct* ISAC_main_inst) { 22936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 22946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return instISAC->encoderSamplingRateKHz; 22956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 22966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 22986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 22996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DecSampRate() 23006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return the sampling rate of the decoded audio. 23016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 23026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 23036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - ISAC_main_inst : iSAC instance 23046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 23056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : enumerator representing sampling frequency 23066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * associated with the decoder, i.e. the 23076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * sampling rate of the decoded audio. 23086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 23096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 23106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinenum IsacSamplingRate WebRtcIsac_DecSampRate(ISACStruct* ISAC_main_inst) { 23116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst; 23126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return instISAC->decoderSamplingRateKHz; 23136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2314