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