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