/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

/******************************************************************

 iLBC Speech Coder ANSI-C Source Code

 WebRtcIlbcfix_AbsQuantLoop.c

******************************************************************/

#include "defines.h"
#include "constants.h"
#include "sort_sq.h"

void WebRtcIlbcfix_AbsQuantLoop(int16_t *syntOutIN, int16_t *in_weightedIN,
                                int16_t *weightDenumIN, size_t *quantLenIN,
                                int16_t *idxVecIN ) {
  size_t k1, k2;
  int16_t index;
  int32_t toQW32;
  int32_t toQ32;
  int16_t tmp16a;
  int16_t xq;

  int16_t *syntOut   = syntOutIN;
  int16_t *in_weighted  = in_weightedIN;
  int16_t *weightDenum  = weightDenumIN;
  size_t *quantLen  = quantLenIN;
  int16_t *idxVec   = idxVecIN;

  for(k1=0;k1<2;k1++) {
    for(k2=0;k2<quantLen[k1];k2++){

      /* Filter to get the predicted value */
      WebRtcSpl_FilterARFastQ12(
          syntOut, syntOut,
          weightDenum, LPC_FILTERORDER+1, 1);

      /* the quantizer */
      toQW32 = (int32_t)(*in_weighted) - (int32_t)(*syntOut);

      toQ32 = (((int32_t)toQW32)<<2);

      if (toQ32 > 32767) {
        toQ32 = (int32_t) 32767;
      } else if (toQ32 < -32768) {
        toQ32 = (int32_t) -32768;
      }

      /* Quantize the state */
      if (toQW32<(-7577)) {
        /* To prevent negative overflow */
        index=0;
      } else if (toQW32>8151) {
        /* To prevent positive overflow */
        index=7;
      } else {
        /* Find the best quantization index
           (state_sq3Tbl is in Q13 and toQ is in Q11)
        */
        WebRtcIlbcfix_SortSq(&xq, &index,
                             (int16_t)toQ32,
                             WebRtcIlbcfix_kStateSq3, 8);
      }

      /* Store selected index */
      (*idxVec++) = index;

      /* Compute decoded sample and update of the prediction filter */
      tmp16a = ((WebRtcIlbcfix_kStateSq3[index] + 2 ) >> 2);

      *syntOut     = (int16_t) (tmp16a + (int32_t)(*in_weighted) - toQW32);

      syntOut++; in_weighted++;
    }
    /* Update perceptual weighting filter at subframe border */
    weightDenum += 11;
  }
}
