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_CbConstruct.c
16 
17 ******************************************************************/
18 
19 #include "cb_construct.h"
20 
21 #include "defines.h"
22 #include "gain_dequant.h"
23 #include "get_cd_vec.h"
24 
25 /*----------------------------------------------------------------*
26  *  Construct decoded vector from codebook and gains.
27  *---------------------------------------------------------------*/
28 
WebRtcIlbcfix_CbConstruct(int16_t * decvector,const int16_t * index,const int16_t * gain_index,int16_t * mem,size_t lMem,size_t veclen)29 bool WebRtcIlbcfix_CbConstruct(
30     int16_t* decvector,        /* (o) Decoded vector */
31     const int16_t* index,      /* (i) Codebook indices */
32     const int16_t* gain_index, /* (i) Gain quantization indices */
33     int16_t* mem,              /* (i) Buffer for codevector construction */
34     size_t lMem,               /* (i) Length of buffer */
35     size_t veclen) {           /* (i) Length of vector */
36   size_t j;
37   int16_t gain[CB_NSTAGES];
38   /* Stack based */
39   int16_t cbvec0[SUBL];
40   int16_t cbvec1[SUBL];
41   int16_t cbvec2[SUBL];
42   int32_t a32;
43   int16_t *gainPtr;
44 
45   /* gain de-quantization */
46 
47   gain[0] = WebRtcIlbcfix_GainDequant(gain_index[0], 16384, 0);
48   gain[1] = WebRtcIlbcfix_GainDequant(gain_index[1], gain[0], 1);
49   gain[2] = WebRtcIlbcfix_GainDequant(gain_index[2], gain[1], 2);
50 
51   /* codebook vector construction and construction of total vector */
52 
53   /* Stack based */
54   if (!WebRtcIlbcfix_GetCbVec(cbvec0, mem, (size_t)index[0], lMem, veclen))
55     return false;  // Failure.
56   if (!WebRtcIlbcfix_GetCbVec(cbvec1, mem, (size_t)index[1], lMem, veclen))
57     return false;  // Failure.
58   if (!WebRtcIlbcfix_GetCbVec(cbvec2, mem, (size_t)index[2], lMem, veclen))
59     return false;  // Failure.
60 
61   gainPtr = &gain[0];
62   for (j=0;j<veclen;j++) {
63     a32 = (*gainPtr++) * cbvec0[j];
64     a32 += (*gainPtr++) * cbvec1[j];
65     a32 += (*gainPtr) * cbvec2[j];
66     gainPtr -= 2;
67     decvector[j] = (int16_t)((a32 + 8192) >> 14);
68   }
69 
70   return true;  // Success.
71 }
72