bool WebRtcIlbcfix_CbConstruct( int16_t* decvector, /* (o) Decoded vector */ const int16_t* index, /* (i) Codebook indices */ const int16_t* gain_index, /* (i) Gain quantization indices */ int16_t* mem, /* (i) Buffer for codevector construction */ size_t lMem, /* (i) Length of buffer */ size_t veclen) { /* (i) Length of vector */ size_t j; int16_t gain[CB_NSTAGES]; /* Stack based */ int16_t cbvec0[SUBL]; int16_t cbvec1[SUBL]; int16_t cbvec2[SUBL]; int32_t a32; int16_t *gainPtr; /* gain de-quantization */ gain[0] = WebRtcIlbcfix_GainDequant(gain_index[0], 16384, 0); gain[1] = WebRtcIlbcfix_GainDequant(gain_index[1], gain[0], 1); gain[2] = WebRtcIlbcfix_GainDequant(gain_index[2], gain[1], 2); /* codebook vector construction and construction of total vector */ /* Stack based */ if (!WebRtcIlbcfix_GetCbVec(cbvec0, mem, (size_t)index[0], lMem, veclen)) return false; // Failure. if (!WebRtcIlbcfix_GetCbVec(cbvec1, mem, (size_t)index[1], lMem, veclen)) return false; // Failure. if (!WebRtcIlbcfix_GetCbVec(cbvec2, mem, (size_t)index[2], lMem, veclen)) return false; // Failure. gainPtr = &gain[0]; for (j=0;j<veclen;j++) { a32 = (*gainPtr++) * cbvec0[j]; a32 += (*gainPtr++) * cbvec1[j]; a32 = OverflowingAddS32S32ToS32(a32, (*gainPtr) * cbvec2[j]); gainPtr -= 2; decvector[j] = (int16_t)((a32 + 8192) >> 14); } return true; // Success. }
void WebRtcIlbcfix_CbConstruct( WebRtc_Word16 *decvector, /* (o) Decoded vector */ WebRtc_Word16 *index, /* (i) Codebook indices */ WebRtc_Word16 *gain_index, /* (i) Gain quantization indices */ WebRtc_Word16 *mem, /* (i) Buffer for codevector construction */ WebRtc_Word16 lMem, /* (i) Length of buffer */ WebRtc_Word16 veclen /* (i) Length of vector */ ){ int j; WebRtc_Word16 gain[CB_NSTAGES]; /* Stack based */ WebRtc_Word16 cbvec0[SUBL]; WebRtc_Word16 cbvec1[SUBL]; WebRtc_Word16 cbvec2[SUBL]; WebRtc_Word32 a32; WebRtc_Word16 *gainPtr; /* gain de-quantization */ gain[0] = WebRtcIlbcfix_GainDequant(gain_index[0], 16384, 0); gain[1] = WebRtcIlbcfix_GainDequant(gain_index[1], gain[0], 1); gain[2] = WebRtcIlbcfix_GainDequant(gain_index[2], gain[1], 2); /* codebook vector construction and construction of total vector */ /* Stack based */ WebRtcIlbcfix_GetCbVec(cbvec0, mem, index[0], lMem, veclen); WebRtcIlbcfix_GetCbVec(cbvec1, mem, index[1], lMem, veclen); WebRtcIlbcfix_GetCbVec(cbvec2, mem, index[2], lMem, veclen); gainPtr = &gain[0]; for (j=0;j<veclen;j++) { a32 = WEBRTC_SPL_MUL_16_16(*gainPtr++, cbvec0[j]); a32 += WEBRTC_SPL_MUL_16_16(*gainPtr++, cbvec1[j]); a32 += WEBRTC_SPL_MUL_16_16(*gainPtr, cbvec2[j]); gainPtr -= 2; decvector[j] = (WebRtc_Word16) WEBRTC_SPL_RSHIFT_W32(a32 + 8192, 14); } return; }
void WebRtcIlbcfix_CbConstruct( int16_t *decvector, /* (o) Decoded vector */ int16_t *index, /* (i) Codebook indices */ int16_t *gain_index, /* (i) Gain quantization indices */ int16_t *mem, /* (i) Buffer for codevector construction */ int16_t lMem, /* (i) Length of buffer */ int16_t veclen /* (i) Length of vector */ ){ int j; int16_t gain[CB_NSTAGES]; /* Stack based */ int16_t cbvec0[SUBL]; int16_t cbvec1[SUBL]; int16_t cbvec2[SUBL]; int32_t a32; int16_t *gainPtr; /* gain de-quantization */ gain[0] = WebRtcIlbcfix_GainDequant(gain_index[0], 16384, 0); gain[1] = WebRtcIlbcfix_GainDequant(gain_index[1], gain[0], 1); gain[2] = WebRtcIlbcfix_GainDequant(gain_index[2], gain[1], 2); /* codebook vector construction and construction of total vector */ /* Stack based */ WebRtcIlbcfix_GetCbVec(cbvec0, mem, index[0], lMem, veclen); WebRtcIlbcfix_GetCbVec(cbvec1, mem, index[1], lMem, veclen); WebRtcIlbcfix_GetCbVec(cbvec2, mem, index[2], lMem, veclen); gainPtr = &gain[0]; for (j=0;j<veclen;j++) { a32 = (*gainPtr++) * cbvec0[j]; a32 += (*gainPtr++) * cbvec1[j]; a32 += (*gainPtr) * cbvec2[j]; gainPtr -= 2; decvector[j] = (int16_t)((a32 + 8192) >> 14); } return; }