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 * encode.c 136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This file contains definition of funtions for encoding. 156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Decoding of upper-band, including 8-12 kHz, when the bandwidth is 166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 0-12 kHz, and 8-16 kHz, when the bandwidth is 0-16 kHz. 176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <stdlib.h> 216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <string.h> 226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <stdio.h> 236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "structs.h" 256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "codec.h" 266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "pitch_estimator.h" 276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "entropy_coding.h" 286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "arith_routines.h" 296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "pitch_gain_tables.h" 306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "pitch_lag_tables.h" 316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "spectrum_ar_model_tables.h" 326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_tables.h" 336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_analysis.h" 346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "bandwidth_estimator.h" 356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_shape_swb12_tables.h" 366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_shape_swb16_tables.h" 376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_gain_swb_tables.h" 386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#define UB_LOOKAHEAD 24 416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Rate allocation tables of lower and upper-band bottleneck for 456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12kHz & 16kHz bandwidth. 466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12 kHz bandwidth 486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ----------------- 496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin The overall bottleneck of the coder is between 38 kbps and 45 kbps. We have 506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin considered 7 enteries, uniformly distributed in this interval, i.e. 38, 516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 39.17, 40.33, 41.5, 42.67, 43.83 and 45. For every entery, the lower-band 526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin and the upper-band bottlenecks are specified in 536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 'kLowerBandBitRate12' and 'kUpperBandBitRate12' 546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tables, respectively. E.g. the overall rate of 41.5 kbps corresponts to a 556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bottleneck of 31 kbps for lower-band and 27 kbps for upper-band. Given an 566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin overall bottleneck of the codec, we use linear interpolation to get 576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lower-band and upper-band bottlenecks. 586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16 kHz bandwidth 606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ----------------- 616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin The overall bottleneck of the coder is between 50 kbps and 56 kbps. We have 626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin considered 7 enteries, uniformly distributed in this interval, i.e. 50, 51.2, 636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 52.4, 53.6, 54.8 and 56. For every entery, the lower-band and the upper-band 646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bottlenecks are specified in 'kLowerBandBitRate16' and 656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 'kUpperBandBitRate16' tables, respectively. E.g. the overall rate 666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin of 53.6 kbps corresponts to a bottleneck of 32 kbps for lower-band and 30 676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kbps for upper-band. Given an overall bottleneck of the codec, we use linear 686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interpolation to get lower-band and upper-band bottlenecks. 696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 38 39.17 40.33 41.5 42.67 43.83 45 */ 736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_Word16 kLowerBandBitRate12[7] = { 746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 29000, 30000, 30000, 31000, 31000, 32000, 32000 }; 756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_Word16 kUpperBandBitRate12[7] = { 766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 25000, 25000, 27000, 27000, 29000, 29000, 32000 }; 776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 50 51.2 52.4 53.6 54.8 56 */ 796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_Word16 kLowerBandBitRate16[6] = { 806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 31000, 31000, 32000, 32000, 32000, 32000 }; 816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_Word16 kUpperBandBitRate16[6] = { 826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 28000, 29000, 29000, 30000, 31000, 32000 }; 836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_RateAllocation() 866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Internal function to perform a rate-allocation for upper and lower-band, 876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * given a total rate. 886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - inRateBitPerSec : a total bottleneck in bits/sec. 916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - rateLBBitPerSec : a bottleneck allocated to the lower-band 946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in bits/sec. 956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * - rateUBBitPerSec : a bottleneck allocated to the upper-band 966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in bits/sec. 976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Return value : 0 if rate allocation has been successful. 996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -1 if failed to allocate rates. 1006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 1016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1026f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_RateAllocation(WebRtc_Word32 inRateBitPerSec, 1036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* rateLBBitPerSec, 1046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* rateUBBitPerSec, 1056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth* bandwidthKHz) { 1066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 idx; 1076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double idxD; 1086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double idxErr; 1096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (inRateBitPerSec < 38000) { 1106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If the given overall bottleneck is less than 38000 then 1116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * then codec has to operate in wideband mode, i.e. 8 kHz 1126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * bandwidth. */ 1136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateLBBitPerSec = (WebRtc_Word16)((inRateBitPerSec > 32000) ? 1146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 32000 : inRateBitPerSec); 1156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateUBBitPerSec = 0; 1166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bandwidthKHz = isac8kHz; 1176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if ((inRateBitPerSec >= 38000) && (inRateBitPerSec < 50000)) { 1186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* At a bottleneck between 38 and 50 kbps the codec is operating 1196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * at 12 kHz bandwidth. Using xxxBandBitRate12[] to calculates 1206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * upper/lower bottleneck */ 1216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find the bottlenecks by linear interpolation, 1236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * step is (45000 - 38000)/6.0 we use the inverse of it. */ 1246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double stepSizeInv = 8.5714286e-4; 1256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idxD = (inRateBitPerSec - 38000) * stepSizeInv; 1266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idx = (idxD >= 6) ? 6 : ((WebRtc_Word16)idxD); 1276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idxErr = idxD - idx; 1286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateLBBitPerSec = kLowerBandBitRate12[idx]; 1296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateUBBitPerSec = kUpperBandBitRate12[idx]; 1306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (idx < 6) { 1326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateLBBitPerSec += (WebRtc_Word16)( 1336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idxErr * (kLowerBandBitRate12[idx + 1] - kLowerBandBitRate12[idx])); 1346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateUBBitPerSec += (WebRtc_Word16)( 1356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idxErr * (kUpperBandBitRate12[idx + 1] - kUpperBandBitRate12[idx])); 1366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bandwidthKHz = isac12kHz; 1386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if ((inRateBitPerSec >= 50000) && (inRateBitPerSec <= 56000)) { 1396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* A bottleneck between 50 and 56 kbps corresponds to bandwidth 1406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of 16 kHz. Using xxxBandBitRate16[] to calculates 1416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * upper/lower bottleneck. */ 1426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find the bottlenecks by linear interpolation 1446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * step is (56000 - 50000)/5 we use the inverse of it. */ 1456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double stepSizeInv = 8.3333333e-4; 1466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idxD = (inRateBitPerSec - 50000) * stepSizeInv; 1476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idx = (idxD >= 5) ? 5 : ((WebRtc_Word16)idxD); 1486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idxErr = idxD - idx; 1496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateLBBitPerSec = kLowerBandBitRate16[idx]; 1506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateUBBitPerSec = kUpperBandBitRate16[idx]; 1516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (idx < 5) { 1536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateLBBitPerSec += (WebRtc_Word16)(idxErr * 1546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (kLowerBandBitRate16[idx + 1] - 1556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kLowerBandBitRate16[idx])); 1566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateUBBitPerSec += (WebRtc_Word16)(idxErr * 1586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (kUpperBandBitRate16[idx + 1] - 1596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kUpperBandBitRate16[idx])); 1606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bandwidthKHz = isac16kHz; 1626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 1636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Out-of-range botlteneck value. */ 1646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 1656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* limit the values. */ 1686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateLBBitPerSec = (*rateLBBitPerSec > 32000) ? 32000 : *rateLBBitPerSec; 1696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *rateUBBitPerSec = (*rateUBBitPerSec > 32000) ? 32000 : *rateUBBitPerSec; 1706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 1716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 1726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_ResetBitstream(Bitstr* bit_stream) { 1756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bit_stream->W_upper = 0xFFFFFFFF; 1766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bit_stream->stream_index = 0; 1776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bit_stream->streamval = 0; 1786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 1796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeLb(float* in, ISACLBEncStruct* ISACencLB_obj, 1816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 codingMode, 1826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bottleneckIndex) { 1836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int stream_length = 0; 1846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 1856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 1866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int iterCntr; 1876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lofilt_coef[(ORDERLO + 1)*SUBFRAMES]; 1896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double hifilt_coef[(ORDERHI + 1)*SUBFRAMES]; 1906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float LP[FRAMESAMPLES_HALF]; 1916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float HP[FRAMESAMPLES_HALF]; 1926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double LP_lookahead[FRAMESAMPLES_HALF]; 1946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double HP_lookahead[FRAMESAMPLES_HALF]; 1956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double LP_lookahead_pf[FRAMESAMPLES_HALF + QLOOKAHEAD]; 1966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double LPw[FRAMESAMPLES_HALF]; 1976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double HPw[FRAMESAMPLES_HALF]; 1996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double LPw_pf[FRAMESAMPLES_HALF]; 2006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 fre[FRAMESAMPLES_HALF]; /* Q7 */ 2016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 fim[FRAMESAMPLES_HALF]; /* Q7 */ 2026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double PitchLags[4]; 2046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double PitchGains[4]; 2056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 PitchGains_Q12[4]; 2066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 AvgPitchGain_Q12; 2076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int frame_mode; /* 0 for 30ms, 1 for 60ms */ 2096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int status = 0; 2106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int my_index; 2116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcode_obj transcodingParam; 2126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double bytesLeftSpecCoding; 2136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 payloadLimitBytes; 2146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Copy new frame-length and bottleneck rate only for the first 10 ms data */ 2166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (ISACencLB_obj->buffer_index == 0) { 2176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Set the framelength for the next packet. */ 2186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->current_framesamples = ISACencLB_obj->new_framelength; 2196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* 'frame_mode' is 0 (30 ms) or 1 (60 ms). */ 2216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin frame_mode = ISACencLB_obj->current_framesamples / MAX_FRAMESAMPLES; 2226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* buffer speech samples (by 10ms packet) until the frame-length */ 2246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* is reached (30 or 60 ms). */ 2256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /*****************************************************************/ 2266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* fill the buffer with 10ms input data */ 2286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_10ms; k++) { 2296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->data_buffer_float[k + ISACencLB_obj->buffer_index] = in[k]; 2306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If buffersize is not equal to current framesize then increase index 2336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * and return. We do no encoding untill we have enough audio. */ 2346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (ISACencLB_obj->buffer_index + FRAMESAMPLES_10ms != FRAMESAMPLES) { 2356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->buffer_index += FRAMESAMPLES_10ms; 2366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 2376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If buffer reached the right size, reset index and continue with 2396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * encoding the frame. */ 2406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->buffer_index = 0; 2416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* End of buffer function. */ 2436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /**************************/ 2446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encoding */ 2466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /************/ 2476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (frame_mode == 0 || ISACencLB_obj->frame_nb == 0) { 2496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This is to avoid Linux warnings until we change 'int' to 'Word32' 2506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * at all places. */ 2516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int intVar; 2526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* reset bitstream */ 2536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(ISACencLB_obj->bitstr_obj)); 2546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((codingMode == 0) && (frame_mode == 0) && 2566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (ISACencLB_obj->enforceFrameSize == 0)) { 2576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->new_framelength = WebRtcIsac_GetNewFrameLength( 2586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bottleneck, ISACencLB_obj->current_framesamples); 2596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->s2nr = WebRtcIsac_GetSnr( 2626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bottleneck, ISACencLB_obj->current_framesamples); 2636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode frame length. */ 2656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = WebRtcIsac_EncodeFrameLen( 2666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->current_framesamples, &ISACencLB_obj->bitstr_obj); 2676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 2686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Wrong frame size. */ 2696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 2706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save framelength for multiple packets memory. */ 2726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->SaveEnc_obj.framelength = 2736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->current_framesamples; 2746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* To be used for Redundant Coding. */ 2766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->lastBWIdx = bottleneckIndex; 2776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin intVar = (int)bottleneckIndex; 2786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeReceiveBw(&intVar, &ISACencLB_obj->bitstr_obj); 2796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Split signal in two bands. */ 2826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_SplitAndFilterFloat(ISACencLB_obj->data_buffer_float, LP, HP, 2836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LP_lookahead, HP_lookahead, 2846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->prefiltbankstr_obj); 2856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* estimate pitch parameters and pitch-filter lookahead signal */ 2876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_PitchAnalysis(LP_lookahead, LP_lookahead_pf, 2886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->pitchanalysisstr_obj, PitchLags, 2896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains); 2906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode in FIX Q12. */ 2926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert PitchGain to Fixed point. */ 2946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 2956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[k] = (WebRtc_Word16)(PitchGains[k] * 4096.0); 2966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Set where to store data in multiple packets memory. */ 2996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (frame_mode == 0 || ISACencLB_obj->frame_nb == 0) { 3006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->SaveEnc_obj.startIdx = 0; 3016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 3026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->SaveEnc_obj.startIdx = 1; 3036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantize & encode pitch parameters. */ 3066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodePitchGain(PitchGains_Q12, &ISACencLB_obj->bitstr_obj, 3076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->SaveEnc_obj); 3086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodePitchLag(PitchLags, PitchGains_Q12, 3096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->bitstr_obj, 3106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->SaveEnc_obj); 3116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin AvgPitchGain_Q12 = (PitchGains_Q12[0] + PitchGains_Q12[1] + 3136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[2] + PitchGains_Q12[3]) >> 2; 3146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find coefficients for perceptual pre-filters. */ 3166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetLpcCoefLb(LP_lookahead_pf, HP_lookahead, 3176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->maskfiltstr_obj, ISACencLB_obj->s2nr, 3186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12, lofilt_coef, hifilt_coef); 3196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Code LPC model and shape - gains not quantized yet. */ 3216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcLb(lofilt_coef, hifilt_coef, &ISACencLB_obj->bitstr_obj, 3226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->SaveEnc_obj); 3236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert PitchGains back to FLOAT for pitchfilter_pre. */ 3256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 4; k++) { 3266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains[k] = ((float)PitchGains_Q12[k]) / 4096; 3276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the state of arithmetic coder before coding LPC gains. */ 3306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.W_upper = ISACencLB_obj->bitstr_obj.W_upper; 3316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream_index = ISACencLB_obj->bitstr_obj.stream_index; 3326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.streamval = ISACencLB_obj->bitstr_obj.streamval; 3336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[0] = 3346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.stream[ISACencLB_obj->bitstr_obj.stream_index - 3356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2]; 3366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[1] = 3376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.stream[ISACencLB_obj->bitstr_obj.stream_index - 3386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1]; 3396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[2] = 3406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.stream[ISACencLB_obj->bitstr_obj.stream_index]; 3416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store LPC Gains before encoding them. */ 3436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 3446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.loFiltGain[k] = lofilt_coef[(LPC_LOBAND_ORDER + 1) * k]; 3456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.hiFiltGain[k] = hifilt_coef[(LPC_HIBAND_ORDER + 1) * k]; 3466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Code gains */ 3496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcGainLb(lofilt_coef, hifilt_coef, 3506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->bitstr_obj, 3516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->SaveEnc_obj); 3526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get the correct value for the payload limit and calculate the 3546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * number of bytes left for coding the spectrum. */ 3556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((frame_mode == 1) && (ISACencLB_obj->frame_nb == 0)) { 3566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* It is a 60ms and we are in the first 30ms then the limit at 3576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * this point should be half of the assigned value. */ 3586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin payloadLimitBytes = ISACencLB_obj->payloadLimitBytes60 >> 1; 3596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (frame_mode == 0) { 3606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* It is a 30ms frame */ 3616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Subract 3 because termination process may add 3 bytes. */ 3626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin payloadLimitBytes = ISACencLB_obj->payloadLimitBytes30 - 3; 3636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 3646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This is the second half of a 60ms frame. */ 3656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Subract 3 because termination process may add 3 bytes. */ 3666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin payloadLimitBytes = ISACencLB_obj->payloadLimitBytes60 - 3; 3676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesLeftSpecCoding = payloadLimitBytes - transcodingParam.stream_index; 3696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Perceptual pre-filtering (using normalized lattice filter). */ 3716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Low-band filtering. */ 3726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_NormLatticeFilterMa(ORDERLO, 3736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->maskfiltstr_obj.PreStateLoF, 3746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->maskfiltstr_obj.PreStateLoG, 3756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LP, lofilt_coef, LPw); 3766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* High-band filtering. */ 3776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_NormLatticeFilterMa(ORDERHI, 3786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->maskfiltstr_obj.PreStateHiF, 3796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->maskfiltstr_obj.PreStateHiG, 3806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin HP, hifilt_coef, HPw); 3816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Pitch filter. */ 3826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_PitchfilterPre(LPw, LPw_pf, &ISACencLB_obj->pitchfiltstr_obj, 3836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags, PitchGains); 3846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Transform */ 3856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Time2Spec(LPw_pf, HPw, fre, fim, &ISACencLB_obj->fftstr_obj); 3866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for multiple packets memory. */ 3886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin my_index = ISACencLB_obj->SaveEnc_obj.startIdx * FRAMESAMPLES_HALF; 3896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencLB_obj->SaveEnc_obj.fre[my_index], fre, sizeof(fre)); 3906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencLB_obj->SaveEnc_obj.fim[my_index], fim, sizeof(fim)); 3916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->SaveEnc_obj.AvgPitchGain[ISACencLB_obj->SaveEnc_obj.startIdx] = 3936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin AvgPitchGain_Q12; 3946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantization and loss-less coding. */ 3966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncodeSpec(fre, fim, AvgPitchGain_Q12, kIsacLowerBand, 3976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->bitstr_obj); 3986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 3996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* There has been an error but it was not too large payload 4006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (we can cure too large payload). */ 4016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (frame_mode == 1 && ISACencLB_obj->frame_nb == 1) { 4026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If this is the second 30ms of a 60ms frame reset 4036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin this such that in the next call encoder starts fresh. */ 4046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->frame_nb = 0; 4056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 4076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin iterCntr = 0; 4096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin while ((ISACencLB_obj->bitstr_obj.stream_index > payloadLimitBytes) || 4106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 4116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double bytesSpecCoderUsed; 4126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double transcodeScale; 4136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (iterCntr >= MAX_PAYLOAD_LIMIT_ITERATION) { 4156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We were not able to limit the payload size */ 4166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((frame_mode == 1) && (ISACencLB_obj->frame_nb == 0)) { 4176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This was the first 30ms of a 60ms frame. Although 4186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin the payload is larger than it should be but we let 4196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin the second 30ms be encoded. Maybe together we 4206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin won't exceed the limit. */ 4216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->frame_nb = 1; 4226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 4236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if ((frame_mode == 1) && (ISACencLB_obj->frame_nb == 1)) { 4246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->frame_nb = 0; 4256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH) { 4286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_PAYLOAD_LARGER_THAN_LIMIT; 4296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 4306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 4316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH) { 4356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesSpecCoderUsed = STREAM_SIZE_MAX; 4366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Being conservative */ 4376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed * 0.5; 4386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 4396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesSpecCoderUsed = ISACencLB_obj->bitstr_obj.stream_index - 4406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream_index; 4416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed; 4426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* To be safe, we reduce the scale depending on 4456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin the number of iterations. */ 4466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodeScale *= (1.0 - (0.9 * (double)iterCntr / 4476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (double)MAX_PAYLOAD_LIMIT_ITERATION)); 4486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale the LPC Gains. */ 4506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 4516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lofilt_coef[(LPC_LOBAND_ORDER + 1) * k] = 4526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.loFiltGain[k] * transcodeScale; 4536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin hifilt_coef[(LPC_HIBAND_ORDER + 1) * k] = 4546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.hiFiltGain[k] * transcodeScale; 4556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.loFiltGain[k] = lofilt_coef[(LPC_LOBAND_ORDER + 1) * k]; 4566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.hiFiltGain[k] = hifilt_coef[(LPC_HIBAND_ORDER + 1) * k]; 4576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale DFT coefficients. */ 4606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_HALF; k++) { 4616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fre[k] = (WebRtc_Word16)(fre[k] * transcodeScale); 4626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fim[k] = (WebRtc_Word16)(fim[k] * transcodeScale); 4636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for multiple packets memory. */ 4666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin my_index = ISACencLB_obj->SaveEnc_obj.startIdx * FRAMESAMPLES_HALF; 4676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencLB_obj->SaveEnc_obj.fre[my_index], fre, sizeof(fre)); 4686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencLB_obj->SaveEnc_obj.fim[my_index], fim, sizeof(fim)); 4696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Re-store the state of arithmetic coder before coding LPC gains. */ 4716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.W_upper = transcodingParam.W_upper; 4726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.stream_index = transcodingParam.stream_index; 4736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.streamval = transcodingParam.streamval; 4746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.stream[transcodingParam.stream_index - 2] = 4756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[0]; 4766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.stream[transcodingParam.stream_index - 1] = 4776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[1]; 4786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->bitstr_obj.stream[transcodingParam.stream_index] = 4796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[2]; 4806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Code gains. */ 4826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcGainLb(lofilt_coef, hifilt_coef, 4836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->bitstr_obj, 4846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->SaveEnc_obj); 4856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Update the number of bytes left for encoding the spectrum. */ 4876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesLeftSpecCoding = payloadLimitBytes - transcodingParam.stream_index; 4886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode the spectrum. */ 4906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncodeSpec(fre, fim, AvgPitchGain_Q12, kIsacLowerBand, 4916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencLB_obj->bitstr_obj); 4926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 4946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* There has been an error but it was not too large 4956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin payload (we can cure too large payload). */ 4966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (frame_mode == 1 && ISACencLB_obj->frame_nb == 1) { 4976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If this is the second 30 ms of a 60 ms frame reset 4986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin this such that in the next call encoder starts fresh. */ 4996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->frame_nb = 0; 5006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 5026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin iterCntr++; 5046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If 60 ms frame-size and just processed the first 30 ms, */ 5076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* go back to main function to buffer the other 30 ms speech frame. */ 5086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (frame_mode == 1) { 5096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (ISACencLB_obj->frame_nb == 0) { 5106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->frame_nb = 1; 5116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 5126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (ISACencLB_obj->frame_nb == 1) { 5136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->frame_nb = 0; 5146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Also update the frame-length for next packet, 5156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin in Adaptive mode only. */ 5166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (codingMode == 0 && (ISACencLB_obj->enforceFrameSize == 0)) { 5176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->new_framelength = 5186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetNewFrameLength(ISACencLB_obj->bottleneck, 5196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->current_framesamples); 5206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 5236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencLB_obj->frame_nb = 0; 5246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Complete arithmetic coding. */ 5276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin stream_length = WebRtcIsac_EncTerminate(&ISACencLB_obj->bitstr_obj); 5286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return stream_length; 5296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 5306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic int LimitPayloadUb(ISACUBEncStruct* ISACencUB_obj, 5346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 payloadLimitBytes, 5356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double bytesLeftSpecCoding, 5366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcode_obj* transcodingParam, 5376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* fre, WebRtc_Word16* fim, 5386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* lpcGains, enum ISACBand band, int status) { 5396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int iterCntr = 0; 5416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 5426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double bytesSpecCoderUsed; 5436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double transcodeScale; 5446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16 kAveragePitchGain = 0.0; 5456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin do { 5476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (iterCntr >= MAX_PAYLOAD_LIMIT_ITERATION) { 5486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We were not able to limit the payload size. */ 5496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_PAYLOAD_LARGER_THAN_LIMIT; 5506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status == -ISAC_DISALLOWED_BITSTREAM_LENGTH) { 5536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesSpecCoderUsed = STREAM_SIZE_MAX; 5546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Being conservative. */ 5556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed * 0.5; 5566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 5576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesSpecCoderUsed = ISACencUB_obj->bitstr_obj.stream_index - 5586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->stream_index; 5596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed; 5606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* To be safe, we reduce the scale depending on the 5636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin number of iterations. */ 5646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodeScale *= (1.0 - (0.9 * (double)iterCntr / 5656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (double)MAX_PAYLOAD_LIMIT_ITERATION)); 5666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale the LPC Gains. */ 5686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (band == kIsacUpperBand16) { 5696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Two sets of coefficients if 16 kHz. */ 5706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 5716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->loFiltGain[k] *= transcodeScale; 5726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->hiFiltGain[k] *= transcodeScale; 5736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 5756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* One sets of coefficients if 12 kHz. */ 5766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 5776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->loFiltGain[k] *= transcodeScale; 5786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale DFT coefficients. */ 5826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_HALF; k++) { 5836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fre[k] = (WebRtc_Word16)(fre[k] * transcodeScale + 0.5); 5846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fim[k] = (WebRtc_Word16)(fim[k] * transcodeScale + 0.5); 5856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store FFT coefficients for multiple encoding. */ 5876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, 5886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(ISACencUB_obj->SaveEnc_obj.realFFT)); 5896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, 5906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(ISACencUB_obj->SaveEnc_obj.imagFFT)); 5916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the state of arithmetic coder before coding LPC gains */ 5936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.W_upper = transcodingParam->W_upper; 5946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream_index = transcodingParam->stream_index; 5956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.streamval = transcodingParam->streamval; 5966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[transcodingParam->stream_index - 2] = 5976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->stream[0]; 5986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[transcodingParam->stream_index - 1] = 5996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->stream[1]; 6006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[transcodingParam->stream_index] = 6016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->stream[2]; 6026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the gains for multiple encoding. */ 6046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.lpcGain, lpcGains, 6056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin SUBFRAMES * sizeof(double)); 6066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy Code lpc-gains, indices are stored for a later use.*/ 6076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcGainUb(transcodingParam->loFiltGain, 6086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->bitstr_obj, 6096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->SaveEnc_obj.lpcGainIndex); 6106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If 16kHz should do one more set. */ 6126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (band == kIsacUpperBand16) { 6136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the gains for multiple encoding. */ 6146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencUB_obj->SaveEnc_obj.lpcGain[SUBFRAMES], 6156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &lpcGains[SUBFRAMES], SUBFRAMES * sizeof(double)); 6166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy Code lpc-gains, indices are stored for a later use.*/ 6176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcGainUb( 6186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam->hiFiltGain, &ISACencUB_obj->bitstr_obj, 6196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->SaveEnc_obj.lpcGainIndex[SUBFRAMES]); 6206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Update the number of bytes left for encoding the spectrum. */ 6236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesLeftSpecCoding = payloadLimitBytes - 6246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream_index; 6256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save the bit-stream object at this point for FEC. */ 6276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj, 6286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->bitstr_obj, sizeof(Bitstr)); 6296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode the spectrum. */ 6316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = WebRtcIsac_EncodeSpec(fre, fim, kAveragePitchGain, 6326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin band, &ISACencUB_obj->bitstr_obj); 6336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((status < 0) && (status != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 6346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* There has been an error but it was not too large payload 6356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (we can cure too large payload). */ 6366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 6376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin iterCntr++; 6396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } while ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) || 6406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (status == -ISAC_DISALLOWED_BITSTREAM_LENGTH)); 6416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 6426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeUb16(float* in, ISACUBEncStruct* ISACencUB_obj, 6456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 jitterInfo) { 6466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 6476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 6486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lpcVecs[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 6506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double percepFilterParams[(1 + UB_LPC_ORDER) * (SUBFRAMES << 1) + 6516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (1 + UB_LPC_ORDER)]; 6526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double LP_lookahead[FRAMESAMPLES]; 6546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 fre[FRAMESAMPLES_HALF]; /* Q7 */ 6556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 fim[FRAMESAMPLES_HALF]; /* Q7 */ 6566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int status = 0; 6586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double varscale[2]; 6606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double corr[SUBFRAMES << 1][UB_LPC_ORDER + 1]; 6616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lpcGains[SUBFRAMES << 1]; 6626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcode_obj transcodingParam; 6636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 payloadLimitBytes; 6646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double s2nr; 6656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16 kAveragePitchGain = 0.0; 6666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int bytesLeftSpecCoding; 6676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Buffer speech samples (by 10ms packet) until the frame-length is */ 6696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* reached (30 ms). */ 6706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /*********************************************************************/ 6716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* fill the buffer with 10ms input data */ 6736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencUB_obj->data_buffer_float[ISACencUB_obj->buffer_index], in, 6746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FRAMESAMPLES_10ms * sizeof(float)); 6756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If buffer size is not equal to current frame-size, and end of file is 6776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * not reached yet, we don't do encoding unless we have the whole frame. */ 6786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (ISACencUB_obj->buffer_index + FRAMESAMPLES_10ms < FRAMESAMPLES) { 6796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->buffer_index += FRAMESAMPLES_10ms; 6806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 6816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* End of buffer function. */ 6846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /**************************/ 6856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encoding */ 6876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /************/ 6886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Reset bit-stream */ 6906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(ISACencUB_obj->bitstr_obj)); 6916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encoding of bandwidth information. */ 6936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeJitterInfo(jitterInfo, &ISACencUB_obj->bitstr_obj); 6946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = WebRtcIsac_EncodeBandwidth(isac16kHz, &ISACencUB_obj->bitstr_obj); 6966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 6976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 6986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin s2nr = WebRtcIsac_GetSnr(ISACencUB_obj->bottleneck, FRAMESAMPLES); 7016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(lpcVecs, ISACencUB_obj->lastLPCVec, UB_LPC_ORDER * sizeof(double)); 7036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES; k++) { 7056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LP_lookahead[k] = ISACencUB_obj->data_buffer_float[UB_LOOKAHEAD + k]; 7066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find coefficients for perceptual pre-filters. */ 7096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetLpcCoefUb(LP_lookahead, &ISACencUB_obj->maskfiltstr_obj, 7106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &lpcVecs[UB_LPC_ORDER], corr, varscale, isac16kHz); 7116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->lastLPCVec, 7136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &lpcVecs[(UB16_LPC_VEC_PER_FRAME - 1) * (UB_LPC_ORDER)], 7146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(double) * UB_LPC_ORDER); 7156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Code LPC model and shape - gains not quantized yet. */ 7176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcUB(lpcVecs, &ISACencUB_obj->bitstr_obj, 7186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin percepFilterParams, isac16kHz, 7196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->SaveEnc_obj); 7206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* the first set of lpc parameters are from the last sub-frame of 7226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * the previous frame. so we don't care about them. */ 7236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetLpcGain(s2nr, &percepFilterParams[UB_LPC_ORDER + 1], 7246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (SUBFRAMES << 1), lpcGains, corr, varscale); 7256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the state of arithmetic coder before coding LPC gains */ 7276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream_index = ISACencUB_obj->bitstr_obj.stream_index; 7286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.W_upper = ISACencUB_obj->bitstr_obj.W_upper; 7296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.streamval = ISACencUB_obj->bitstr_obj.streamval; 7306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[0] = 7316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index - 7326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2]; 7336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[1] = 7346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index - 7356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1]; 7366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[2] = 7376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index]; 7386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store LPC Gains before encoding them. */ 7406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 7416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.loFiltGain[k] = lpcGains[k]; 7426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.hiFiltGain[k] = lpcGains[SUBFRAMES + k]; 7436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the gains for multiple encoding. */ 7466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.lpcGain, lpcGains, 7476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (SUBFRAMES << 1) * sizeof(double)); 7486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcGainUb(lpcGains, &ISACencUB_obj->bitstr_obj, 7506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->SaveEnc_obj.lpcGainIndex); 7516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcGainUb( 7526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &lpcGains[SUBFRAMES], &ISACencUB_obj->bitstr_obj, 7536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->SaveEnc_obj.lpcGainIndex[SUBFRAMES]); 7546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get the correct value for the payload limit and calculate the number of 7566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytes left for coding the spectrum. It is a 30ms frame 7576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Subract 3 because termination process may add 3 bytes */ 7586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin payloadLimitBytes = ISACencUB_obj->maxPayloadSizeBytes - 7596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->numBytesUsed - 3; 7606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesLeftSpecCoding = payloadLimitBytes - 7616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream_index; 7626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < (SUBFRAMES << 1); k++) { 7646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin percepFilterParams[k * (UB_LPC_ORDER + 1) + (UB_LPC_ORDER + 1)] = 7656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lpcGains[k]; 7666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* LPC filtering (using normalized lattice filter), */ 7696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* first half-frame. */ 7706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_NormLatticeFilterMa(UB_LPC_ORDER, 7716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->maskfiltstr_obj.PreStateLoF, 7726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->maskfiltstr_obj.PreStateLoG, 7736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->data_buffer_float[0], 7746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &percepFilterParams[UB_LPC_ORDER + 1], 7756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &LP_lookahead[0]); 7766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Second half-frame filtering. */ 7786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_NormLatticeFilterMa( 7796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_ORDER, ISACencUB_obj->maskfiltstr_obj.PreStateLoF, 7806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->maskfiltstr_obj.PreStateLoG, 7816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->data_buffer_float[FRAMESAMPLES_HALF], 7826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &percepFilterParams[(UB_LPC_ORDER + 1) + SUBFRAMES * (UB_LPC_ORDER + 1)], 7836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &LP_lookahead[FRAMESAMPLES_HALF]); 7846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Time2Spec(&LP_lookahead[0], &LP_lookahead[FRAMESAMPLES_HALF], 7866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fre, fim, &ISACencUB_obj->fftstr_obj); 7876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store FFT coefficients for multiple encoding. */ 7896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, sizeof(fre)); 7906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, sizeof(fim)); 7916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Prepare the audio buffer for the next packet 7936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * move the last 3 ms to the beginning of the buffer. */ 7946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->data_buffer_float, 7956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->data_buffer_float[FRAMESAMPLES], 7966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LB_TOTAL_DELAY_SAMPLES * sizeof(float)); 7976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* start writing with 3 ms delay to compensate for the delay 7986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of the lower-band. */ 7996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->buffer_index = LB_TOTAL_DELAY_SAMPLES; 8006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save the bit-stream object at this point for FEC. */ 8026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj, &ISACencUB_obj->bitstr_obj, 8036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(Bitstr)); 8046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Qantization and lossless coding */ 8066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Note that there is no pitch-gain for this band so kAveragePitchGain = 0 8076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * is passed to the function. In fact, the function ignores the 3rd parameter 8086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * for this band. */ 8096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncodeSpec(fre, fim, kAveragePitchGain, kIsacUpperBand16, 8106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->bitstr_obj); 8116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 8126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 8136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) || 8166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 8176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = LimitPayloadUb(ISACencUB_obj, payloadLimitBytes, bytesLeftSpecCoding, 8186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &transcodingParam, fre, fim, lpcGains, 8196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kIsacUpperBand16, err); 8206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 8226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 8236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Complete arithmetic coding. */ 8256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return WebRtcIsac_EncTerminate(&ISACencUB_obj->bitstr_obj); 8266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 8276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeUb12(float* in, ISACUBEncStruct* ISACencUB_obj, 8306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 jitterInfo) { 8316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 8326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 8336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lpcVecs[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME]; 8356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double percepFilterParams[(1 + UB_LPC_ORDER) * SUBFRAMES]; 8376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float LP[FRAMESAMPLES_HALF]; 8386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float HP[FRAMESAMPLES_HALF]; 8396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double LP_lookahead[FRAMESAMPLES_HALF]; 8416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double HP_lookahead[FRAMESAMPLES_HALF]; 8426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double LPw[FRAMESAMPLES_HALF]; 8436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double HPw[FRAMESAMPLES_HALF]; 8456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 fre[FRAMESAMPLES_HALF]; /* Q7 */ 8466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 fim[FRAMESAMPLES_HALF]; /* Q7 */ 8476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int status = 0; 8496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double varscale[1]; 8516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double corr[UB_LPC_GAIN_DIM][UB_LPC_ORDER + 1]; 8536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lpcGains[SUBFRAMES]; 8546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcode_obj transcodingParam; 8556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 payloadLimitBytes; 8566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double s2nr; 8576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16 kAveragePitchGain = 0.0; 8586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double bytesLeftSpecCoding; 8596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Buffer speech samples (by 10ms packet) until the framelength is */ 8616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* reached (30 ms). */ 8626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /********************************************************************/ 8636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Fill the buffer with 10ms input data. */ 8656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencUB_obj->data_buffer_float[ISACencUB_obj->buffer_index], in, 8666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FRAMESAMPLES_10ms * sizeof(float)); 8676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* if buffer-size is not equal to current frame-size then increase the 8696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index and return. We do the encoding when we have enough audio. */ 8706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (ISACencUB_obj->buffer_index + FRAMESAMPLES_10ms < FRAMESAMPLES) { 8716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->buffer_index += FRAMESAMPLES_10ms; 8726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 8736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If buffer reached the right size, reset index and continue 8756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin with encoding the frame */ 8766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->buffer_index = 0; 8776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* End of buffer function */ 8796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /**************************/ 8806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encoding */ 8826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /************/ 8836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Reset bit-stream. */ 8856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(&(ISACencUB_obj->bitstr_obj)); 8866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encoding bandwidth information. */ 8886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeJitterInfo(jitterInfo, &ISACencUB_obj->bitstr_obj); 8896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = WebRtcIsac_EncodeBandwidth(isac12kHz, &ISACencUB_obj->bitstr_obj); 8906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 8916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 8926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin s2nr = WebRtcIsac_GetSnr(ISACencUB_obj->bottleneck, FRAMESAMPLES); 8956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Split signal in two bands. */ 8976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_SplitAndFilterFloat(ISACencUB_obj->data_buffer_float, HP, LP, 8986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin HP_lookahead, LP_lookahead, 8996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->prefiltbankstr_obj); 9006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find coefficients for perceptual pre-filters. */ 9026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetLpcCoefUb(LP_lookahead, &ISACencUB_obj->maskfiltstr_obj, 9036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lpcVecs, corr, varscale, isac12kHz); 9046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Code LPC model and shape - gains not quantized yet. */ 9066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcUB(lpcVecs, &ISACencUB_obj->bitstr_obj, 9076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin percepFilterParams, isac12kHz, 9086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->SaveEnc_obj); 9096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_GetLpcGain(s2nr, percepFilterParams, SUBFRAMES, lpcGains, corr, 9116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin varscale); 9126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the state of arithmetic coder before coding LPC gains. */ 9146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.W_upper = ISACencUB_obj->bitstr_obj.W_upper; 9156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream_index = ISACencUB_obj->bitstr_obj.stream_index; 9166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.streamval = ISACencUB_obj->bitstr_obj.streamval; 9176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[0] = 9186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index - 9196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2]; 9206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[1] = 9216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index - 9226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1]; 9236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.stream[2] = 9246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index]; 9256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store LPC Gains before encoding them. */ 9276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 9286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin transcodingParam.loFiltGain[k] = lpcGains[k]; 9296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the gains for multiple encoding. */ 9326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.lpcGain, lpcGains, SUBFRAMES * 9336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(double)); 9346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLpcGainUb(lpcGains, &ISACencUB_obj->bitstr_obj, 9366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->SaveEnc_obj.lpcGainIndex); 9376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 9396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin percepFilterParams[k * (UB_LPC_ORDER + 1)] = lpcGains[k]; 9406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* perceptual pre-filtering (using normalized lattice filter) */ 9436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* low-band filtering */ 9446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_NormLatticeFilterMa(UB_LPC_ORDER, 9456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->maskfiltstr_obj.PreStateLoF, 9466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->maskfiltstr_obj.PreStateLoG, LP, 9476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin percepFilterParams, LPw); 9486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get the correct value for the payload limit and calculate the number 9506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin of bytes left for coding the spectrum. It is a 30ms frame Subract 3 9516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin because termination process may add 3 bytes */ 9526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin payloadLimitBytes = ISACencUB_obj->maxPayloadSizeBytes - 9536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->numBytesUsed - 3; 9546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bytesLeftSpecCoding = payloadLimitBytes - 9556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACencUB_obj->bitstr_obj.stream_index; 9566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(HPw, 0, sizeof(HPw)); 9586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Transform */ 9606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Time2Spec(LPw, HPw, fre, fim, &ISACencUB_obj->fftstr_obj); 9616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store FFT coefficients for multiple encoding. */ 9636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, 9646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(ISACencUB_obj->SaveEnc_obj.realFFT)); 9656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, 9666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(ISACencUB_obj->SaveEnc_obj.imagFFT)); 9676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save the bit-stream object at this point for FEC. */ 9696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj, 9706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->bitstr_obj, sizeof(Bitstr)); 9716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantization and loss-less coding */ 9736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* The 4th parameter to this function is pitch-gain, which is only used 9746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * when encoding 0-8 kHz band, and irrelevant in this function, therefore, 9756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * we insert zero here. */ 9766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncodeSpec(fre, fim, kAveragePitchGain, kIsacUpperBand12, 9776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACencUB_obj->bitstr_obj); 9786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 9796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* There has been an error but it was not too large 9806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin payload (we can cure too large payload) */ 9816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 9826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) || 9856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH)) { 9866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = LimitPayloadUb(ISACencUB_obj, payloadLimitBytes, bytesLeftSpecCoding, 9876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &transcodingParam, fre, fim, lpcGains, 9886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kIsacUpperBand12, err); 9896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 9916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 9926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Complete arithmetic coding. */ 9946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return WebRtcIsac_EncTerminate(&ISACencUB_obj->bitstr_obj); 9956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 9966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* This function is used to create a new bit-stream with new BWE. 10036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin The same data as previously encoded with the function WebRtcIsac_Encoder(). 10046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin The data needed is taken from the structure, where it was stored 10056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin when calling the encoder. */ 10066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeStoredDataLb(const ISAC_SaveEncData_t* ISACSavedEnc_obj, 10086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* ISACBitStr_obj, int BWnumber, 10096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float scale) { 10106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int ii; 10116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int status; 10126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int BWno = BWnumber; 10136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* WebRtcIsac_kQPitchGainCdf_ptr[1]; 10156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16** cdf; 10166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpLPCcoeffs_lo[(ORDERLO + 1)*SUBFRAMES * 2]; 10186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpLPCcoeffs_hi[(ORDERHI + 1)*SUBFRAMES * 2]; 10196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int tmpLPCindex_g[12 * 2]; 10206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 tmp_fre[FRAMESAMPLES], tmp_fim[FRAMESAMPLES]; 10216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const int kModel = 0; 10226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Sanity Check - possible values for BWnumber is 0 - 23. */ 10246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((BWnumber < 0) || (BWnumber > 23)) { 10256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_BW_ESTIMATOR; 10266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Reset bit-stream. */ 10296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(ISACBitStr_obj); 10306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode frame length */ 10326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = WebRtcIsac_EncodeFrameLen(ISACSavedEnc_obj->framelength, 10336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACBitStr_obj); 10346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 10356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Wrong frame size. */ 10366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 10376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Transcoding */ 10406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((scale > 0.0) && (scale < 1.0)) { 10416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Compensate LPC gain. */ 10426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (ii = 0; 10436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii < ((ORDERLO + 1)* SUBFRAMES * (1 + ISACSavedEnc_obj->startIdx)); 10446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii++) { 10456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpLPCcoeffs_lo[ii] = scale * ISACSavedEnc_obj->LPCcoeffs_lo[ii]; 10466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (ii = 0; 10486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii < ((ORDERHI + 1) * SUBFRAMES * (1 + ISACSavedEnc_obj->startIdx)); 10496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii++) { 10506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpLPCcoeffs_hi[ii] = scale * ISACSavedEnc_obj->LPCcoeffs_hi[ii]; 10516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale DFT. */ 10536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (ii = 0; 10546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii < (FRAMESAMPLES_HALF * (1 + ISACSavedEnc_obj->startIdx)); 10556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii++) { 10566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp_fre[ii] = (WebRtc_Word16)((scale) * (float)ISACSavedEnc_obj->fre[ii]); 10576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp_fim[ii] = (WebRtc_Word16)((scale) * (float)ISACSavedEnc_obj->fim[ii]); 10586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 10606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (ii = 0; 10616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii < (KLT_ORDER_GAIN * (1 + ISACSavedEnc_obj->startIdx)); 10626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii++) { 10636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpLPCindex_g[ii] = ISACSavedEnc_obj->LPCindex_g[ii]; 10646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (ii = 0; 10666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii < (FRAMESAMPLES_HALF * (1 + ISACSavedEnc_obj->startIdx)); 10676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ii++) { 10686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp_fre[ii] = ISACSavedEnc_obj->fre[ii]; 10696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp_fim[ii] = ISACSavedEnc_obj->fim[ii]; 10706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode bandwidth estimate. */ 10746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeReceiveBw(&BWno, ISACBitStr_obj); 10756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Loop over number of 30 msec */ 10776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (ii = 0; ii <= ISACSavedEnc_obj->startIdx; ii++) { 10786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode pitch gains. */ 10796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf; 10806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(ISACBitStr_obj, 10816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACSavedEnc_obj->pitchGain_index[ii], 10826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQPitchGainCdf_ptr, 1); 10836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy coding of quantization pitch lags */ 10856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Voicing classification. */ 10866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (ISACSavedEnc_obj->meanGain[ii] < 0.2) { 10876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrLo; 10886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (ISACSavedEnc_obj->meanGain[ii] < 0.4) { 10896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrMid; 10906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 10916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrHi; 10926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(ISACBitStr_obj, 10946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACSavedEnc_obj->pitchIndex[PITCH_SUBFRAMES * ii], 10956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf, PITCH_SUBFRAMES); 10966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* LPC */ 10986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Only one model exists. The entropy coding is done only for backward 10996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * compatibility. */ 11006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(ISACBitStr_obj, &kModel, 11016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltModelCdfPtr, 1); 11026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy coding of quantization indices - LPC shape only. */ 11036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(ISACBitStr_obj, 11046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACSavedEnc_obj->LPCindex_s[KLT_ORDER_SHAPE * ii], 11056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltCdfPtrShape, 11066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin KLT_ORDER_SHAPE); 11076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If transcoding, get new LPC gain indices */ 11096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (scale < 1.0) { 11106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_TranscodeLPCCoef( 11116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &tmpLPCcoeffs_lo[(ORDERLO + 1) * SUBFRAMES * ii], 11126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &tmpLPCcoeffs_hi[(ORDERHI + 1)*SUBFRAMES * ii], 11136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &tmpLPCindex_g[KLT_ORDER_GAIN * ii]); 11146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy coding of quantization indices - LPC gain. */ 11176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(ISACBitStr_obj, &tmpLPCindex_g[KLT_ORDER_GAIN * ii], 11186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltCdfPtrGain, KLT_ORDER_GAIN); 11196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantization and loss-less coding. */ 11216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = WebRtcIsac_EncodeSpec(&tmp_fre[ii * FRAMESAMPLES_HALF], 11226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &tmp_fim[ii * FRAMESAMPLES_HALF], 11236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACSavedEnc_obj->AvgPitchGain[ii], 11246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kIsacLowerBand, ISACBitStr_obj); 11256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 11266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 11276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Complete arithmetic coding. */ 11306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return WebRtcIsac_EncTerminate(ISACBitStr_obj); 11316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 11326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeStoredDataUb( 11356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const ISACUBSaveEncDataStruct* ISACSavedEnc_obj, 11366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* bitStream, 11376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 jitterInfo, 11386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin float scale, 11396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth bandwidth) { 11406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int n; 11416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 11426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lpcGain[SUBFRAMES]; 11436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 realFFT[FRAMESAMPLES_HALF]; 11446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 imagFFT[FRAMESAMPLES_HALF]; 11456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16** shape_cdf; 11466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int shape_len; 11476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16 kAveragePitchGain = 0.0; 11486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBand band; 11496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Reset bitstream. */ 11506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ResetBitstream(bitStream); 11516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode jitter index. */ 11536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeJitterInfo(jitterInfo, bitStream); 11546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncodeBandwidth(bandwidth, bitStream); 11566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 11576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 11586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Encode LPC-shape. */ 11616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth == isac12kHz) { 11626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shape_cdf = WebRtcIsac_kLpcShapeCdfMatUb12; 11636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shape_len = UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME; 11646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin band = kIsacUpperBand12; 11656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 11666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shape_cdf = WebRtcIsac_kLpcShapeCdfMatUb16; 11676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shape_len = UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME; 11686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin band = kIsacUpperBand16; 11696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(bitStream, ISACSavedEnc_obj->indexLPCShape, 11716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shape_cdf, shape_len); 11726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((scale <= 0.0) || (scale >= 1.0)) { 11746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We only consider scales between zero and one. */ 11756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(bitStream, ISACSavedEnc_obj->lpcGainIndex, 11766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kLpcGainCdfMat, UB_LPC_GAIN_DIM); 11776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth == isac16kHz) { 11786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store gain indices of the second half. */ 11796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(bitStream, 11806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin &ISACSavedEnc_obj->lpcGainIndex[SUBFRAMES], 11816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kLpcGainCdfMat, UB_LPC_GAIN_DIM); 11826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store FFT coefficients. */ 11846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncodeSpec(ISACSavedEnc_obj->realFFT, 11856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACSavedEnc_obj->imagFFT, kAveragePitchGain, 11866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin band, bitStream); 11876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 11886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale LPC gain and FFT coefficients. */ 11896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 11906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lpcGain[n] = scale * ISACSavedEnc_obj->lpcGain[n]; 11916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store LPC gains. */ 11936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_StoreLpcGainUb(lpcGain, bitStream); 11946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth == isac16kHz) { 11966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale and code the gains of the second half of the frame, if 16kHz. */ 11976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 11986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lpcGain[n] = scale * ISACSavedEnc_obj->lpcGain[n + SUBFRAMES]; 11996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_StoreLpcGainUb(lpcGain, bitStream); 12016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES_HALF; n++) { 12046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin realFFT[n] = (WebRtc_Word16)(scale * (float)ISACSavedEnc_obj->realFFT[n] + 12056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 0.5f); 12066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin imagFFT[n] = (WebRtc_Word16)(scale * (float)ISACSavedEnc_obj->imagFFT[n] + 12076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 0.5f); 12086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store FFT coefficients. */ 12106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncodeSpec(realFFT, imagFFT, kAveragePitchGain, 12116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin band, bitStream); 12126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 12146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Error happened while encoding FFT coefficients. */ 12156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 12166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Complete arithmetic coding. */ 12196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return WebRtcIsac_EncTerminate(bitStream); 12206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 12216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12226f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_GetRedPayloadUb( 12236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const ISACUBSaveEncDataStruct* ISACSavedEncObj, 12246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* bitStreamObj, 12256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth bandwidth) { 12266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int n; 12276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 status; 12286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 realFFT[FRAMESAMPLES_HALF]; 12296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 imagFFT[FRAMESAMPLES_HALF]; 12306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBand band; 12316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16 kAveragePitchGain = 0.0; 12326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store bit-stream object. */ 12336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(bitStreamObj, &ISACSavedEncObj->bitStreamObj, sizeof(Bitstr)); 12346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale FFT coefficients. */ 12366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES_HALF; n++) { 12376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin realFFT[n] = (WebRtc_Word16)((float)ISACSavedEncObj->realFFT[n] * 12386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin RCU_TRANSCODING_SCALE_UB + 0.5); 12396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin imagFFT[n] = (WebRtc_Word16)((float)ISACSavedEncObj->imagFFT[n] * 12406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin RCU_TRANSCODING_SCALE_UB + 0.5); 12416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin band = (bandwidth == isac12kHz) ? kIsacUpperBand12 : kIsacUpperBand16; 12446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = WebRtcIsac_EncodeSpec(realFFT, imagFFT, kAveragePitchGain, band, 12456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bitStreamObj); 12466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) { 12476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 12486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 12496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Terminate entropy coding */ 12506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return WebRtcIsac_EncTerminate(bitStreamObj); 12516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 1253