/*
 *  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.
 */

/*
 * initialize.c
 *
 * Internal initfunctions
 *
 */

#include "codec.h"
#include "structs.h"
#include "pitch_estimator.h"


void WebRtcIsacfix_InitMaskingEnc(MaskFiltstr_enc *maskdata) {

  int k;

  for (k = 0; k < WINLEN; k++) {
    maskdata->DataBufferLoQ0[k] = (WebRtc_Word16) 0;
    maskdata->DataBufferHiQ0[k] = (WebRtc_Word16) 0;
  }
  for (k = 0; k < ORDERLO+1; k++) {
    maskdata->CorrBufLoQQ[k] = (WebRtc_Word32) 0;
    maskdata->CorrBufLoQdom[k] = 0;

    maskdata->PreStateLoGQ15[k] = 0;

  }
  for (k = 0; k < ORDERHI+1; k++) {
    maskdata->CorrBufHiQQ[k] = (WebRtc_Word32) 0;
    maskdata->CorrBufHiQdom[k] = 0;
    maskdata->PreStateHiGQ15[k] = 0;
  }

  maskdata->OldEnergy = 10;

  return;
}

void WebRtcIsacfix_InitMaskingDec(MaskFiltstr_dec *maskdata) {

  int k;

  for (k = 0; k < ORDERLO+1; k++)
  {
    maskdata->PostStateLoGQ0[k] = 0;
  }
  for (k = 0; k < ORDERHI+1; k++)
  {
    maskdata->PostStateHiGQ0[k] = 0;
  }

  maskdata->OldEnergy = 10;

  return;
}







void WebRtcIsacfix_InitPreFilterbank(PreFiltBankstr *prefiltdata)
{
  int k;

  for (k = 0; k < QLOOKAHEAD; k++) {
    prefiltdata->INLABUF1_fix[k] = 0;
    prefiltdata->INLABUF2_fix[k] = 0;
  }
  for (k = 0; k < WEBRTC_SPL_MUL_16_16(2,(QORDER-1)); k++) {

    prefiltdata->INSTAT1_fix[k] = 0;
    prefiltdata->INSTAT2_fix[k] = 0;
  }

  /* High pass filter states */
  prefiltdata->HPstates_fix[0] = 0;
  prefiltdata->HPstates_fix[1] = 0;

  return;
}

void WebRtcIsacfix_InitPostFilterbank(PostFiltBankstr *postfiltdata)
{
  int k;

  for (k = 0; k < WEBRTC_SPL_MUL_16_16(2, POSTQORDER); k++) {

    postfiltdata->STATE_0_LOWER_fix[k] = 0;
    postfiltdata->STATE_0_UPPER_fix[k] = 0;
  }

  /* High pass filter states */

  postfiltdata->HPstates1_fix[0] = 0;
  postfiltdata->HPstates1_fix[1] = 0;

  postfiltdata->HPstates2_fix[0] = 0;
  postfiltdata->HPstates2_fix[1] = 0;

  return;
}


void WebRtcIsacfix_InitPitchFilter(PitchFiltstr *pitchfiltdata)
{
  int k;

  for (k = 0; k < PITCH_BUFFSIZE; k++)
    pitchfiltdata->ubufQQ[k] = 0;
  for (k = 0; k < (PITCH_DAMPORDER); k++)
    pitchfiltdata->ystateQQ[k] = 0;

  pitchfiltdata->oldlagQ7 = 6400; /* 50.0 in Q7 */
  pitchfiltdata->oldgainQ12 = 0;
}

void WebRtcIsacfix_InitPitchAnalysis(PitchAnalysisStruct *State)
{
  int k;

  for (k = 0; k < PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2; k++) {
    State->dec_buffer16[k] = 0;
  }
  for (k = 0; k < WEBRTC_SPL_MUL_16_16(2, ALLPASSSECTIONS)+1; k++) {
    State->decimator_state32[k] = 0;
  }

  for (k = 0; k < QLOOKAHEAD; k++)
    State->inbuf[k] = 0;

  WebRtcIsacfix_InitPitchFilter(&(State->PFstr_wght));

  WebRtcIsacfix_InitPitchFilter(&(State->PFstr));
}


void WebRtcIsacfix_InitPlc( PLCstr *State )
{
  State->decayCoeffPriodic = WEBRTC_SPL_WORD16_MAX;
  State->decayCoeffNoise = WEBRTC_SPL_WORD16_MAX;

  State->used = PLC_WAS_USED;

  WebRtcSpl_ZerosArrayW16(State->overlapLP, RECOVERY_OVERLAP);
  WebRtcSpl_ZerosArrayW16(State->lofilt_coefQ15, ORDERLO);
  WebRtcSpl_ZerosArrayW16(State->hifilt_coefQ15, ORDERHI );

  State->AvgPitchGain_Q12 = 0;
  State->lastPitchGain_Q12 = 0;
  State->lastPitchLag_Q7 = 0;
  State->gain_lo_hiQ17[0]=State->gain_lo_hiQ17[1] = 0;
  WebRtcSpl_ZerosArrayW16(State->prevPitchInvIn, FRAMESAMPLES/2);
  WebRtcSpl_ZerosArrayW16(State->prevPitchInvOut, PITCH_MAX_LAG + 10 );
  WebRtcSpl_ZerosArrayW32(State->prevHP, PITCH_MAX_LAG + 10 );
  State->pitchCycles = 0;
  State->A = 0;
  State->B = 0;
  State->pitchIndex = 0;
  State->stretchLag = 240;
  State->seed = 4447;


}
