1/*
2 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11/******************************************************************
12
13 iLBC Speech Coder ANSI-C Source Code
14
15 WebRtcIlbcfix_GetCbVec.c
16
17******************************************************************/
18
19#include "defines.h"
20#include "constants.h"
21#include "create_augmented_vec.h"
22
23/*----------------------------------------------------------------*
24 *  Construct codebook vector for given index.
25 *---------------------------------------------------------------*/
26
27void WebRtcIlbcfix_GetCbVec(
28    int16_t *cbvec,   /* (o) Constructed codebook vector */
29    int16_t *mem,   /* (i) Codebook buffer */
30    int16_t index,   /* (i) Codebook index */
31    int16_t lMem,   /* (i) Length of codebook buffer */
32    int16_t cbveclen   /* (i) Codebook vector length */
33                            ){
34  int16_t k, base_size;
35  int16_t lag;
36  /* Stack based */
37  int16_t tempbuff2[SUBL+5];
38
39  /* Determine size of codebook sections */
40
41  base_size=lMem-cbveclen+1;
42
43  if (cbveclen==SUBL) {
44    base_size+=WEBRTC_SPL_RSHIFT_W16(cbveclen,1);
45  }
46
47  /* No filter -> First codebook section */
48
49  if (index<lMem-cbveclen+1) {
50
51    /* first non-interpolated vectors */
52
53    k=index+cbveclen;
54    /* get vector */
55    WEBRTC_SPL_MEMCPY_W16(cbvec, mem+lMem-k, cbveclen);
56
57  } else if (index < base_size) {
58
59    /* Calculate lag */
60
61    k=(int16_t)WEBRTC_SPL_MUL_16_16(2, (index-(lMem-cbveclen+1)))+cbveclen;
62
63    lag=WEBRTC_SPL_RSHIFT_W16(k, 1);
64
65    WebRtcIlbcfix_CreateAugmentedVec(lag, mem+lMem, cbvec);
66
67  }
68
69  /* Higher codebbok section based on filtering */
70
71  else {
72
73    int16_t memIndTest;
74
75    /* first non-interpolated vectors */
76
77    if (index-base_size<lMem-cbveclen+1) {
78
79      /* Set up filter memory, stuff zeros outside memory buffer */
80
81      memIndTest = lMem-(index-base_size+cbveclen);
82
83      WebRtcSpl_MemSetW16(mem-CB_HALFFILTERLEN, 0, CB_HALFFILTERLEN);
84      WebRtcSpl_MemSetW16(mem+lMem, 0, CB_HALFFILTERLEN);
85
86      /* do filtering to get the codebook vector */
87
88      WebRtcSpl_FilterMAFastQ12(
89          &mem[memIndTest+4], cbvec, (int16_t*)WebRtcIlbcfix_kCbFiltersRev,
90          CB_FILTERLEN, cbveclen);
91    }
92
93    /* interpolated vectors */
94
95    else {
96      /* Stuff zeros outside memory buffer  */
97      memIndTest = lMem-cbveclen-CB_FILTERLEN;
98      WebRtcSpl_MemSetW16(mem+lMem, 0, CB_HALFFILTERLEN);
99
100      /* do filtering */
101      WebRtcSpl_FilterMAFastQ12(
102          &mem[memIndTest+7], tempbuff2, (int16_t*)WebRtcIlbcfix_kCbFiltersRev,
103          CB_FILTERLEN, (int16_t)(cbveclen+5));
104
105      /* Calculate lag index */
106      lag = (cbveclen<<1)-20+index-base_size-lMem-1;
107
108      WebRtcIlbcfix_CreateAugmentedVec(lag, tempbuff2+SUBL+5, cbvec);
109    }
110  }
111}
112