summaryrefslogtreecommitdiff
path: root/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/dec_alg_codebook.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/dec_alg_codebook.cpp')
-rw-r--r--opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/dec_alg_codebook.cpp384
1 files changed, 384 insertions, 0 deletions
diff --git a/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/dec_alg_codebook.cpp b/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/dec_alg_codebook.cpp
new file mode 100644
index 0000000..76ad69c
--- /dev/null
+++ b/opencore/codecs_v2/audio/gsm_amr/amr_wb/dec/src/dec_alg_codebook.cpp
@@ -0,0 +1,384 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+ 3GPP TS 26.173
+ ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+ Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: dec_alg_codebook.cpp
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ decoding of algebraic codebook
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "q_pulse.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define NB_POS 16 /* pos in track, mask for sign bit */
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void dec_1p_N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+ int16 pos1;
+ int32 mask, i;
+
+ mask = ((1 << N) - 1);
+ /*-------------------------------------------------------*
+ * Decode 1 pulse with N+1 bits: *
+ *-------------------------------------------------------*/
+ pos1 = ((index & mask) + offset);
+
+ i = ((index >> N) & 1L); /* i = ((index >> N) & 1); */
+
+ if (i == 1)
+ {
+ pos1 += NB_POS;
+ }
+ pos[0] = pos1;
+
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_2p_2N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+ int16 pos1, pos2, tmp;
+ int32 mask, i;
+
+ mask = (int32)(sub_int16(shl_int16(1, N), 1)); /* mask = ((1<<N)-1); */
+ /*-------------------------------------------------------*
+ * Decode 2 pulses with 2*N+1 bits: *
+ *-------------------------------------------------------*/
+ /* pos1 = (((index >> N) & mask) + offset); */
+ pos1 = (int16)(add_int32((shr_int32(index, N) & mask), (int32)(offset)));
+ tmp = shl_int16(N, 1);
+ i = (index >> tmp) & 1L; /* i = (index >> (2*N)) & 1; */
+ pos2 = add_int16((int16)(index & mask), offset); /* pos2 = ((index & mask) + offset); */
+
+ if (pos2 < pos1) /* ((pos2 - pos1) < 0) */
+ {
+ if (i == 1)
+ { /* (i == 1) */
+ pos1 += NB_POS; /* pos1 += NB_POS; */
+ }
+ else
+ {
+ pos2 += NB_POS; /* pos2 += NB_POS; */
+ }
+ }
+ else
+ {
+ if (i == 1)
+ { /* (i == 1) */
+ pos1 += NB_POS; /* pos1 += NB_POS; */
+ pos2 += NB_POS; /* pos2 += NB_POS; */
+ }
+ }
+
+ pos[0] = pos1;
+ pos[1] = pos2;
+
+ return;
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_3p_3N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+ int16 j, tmp;
+ int32 mask, idx;
+
+ /*-------------------------------------------------------*
+ * Decode 3 pulses with 3*N+1 bits: *
+ *-------------------------------------------------------*/
+ tmp = sub_int16(shl_int16(N, 1), 1); /* mask = ((1<<((2*N)-1))-1); */
+
+ mask = ((1 << ((2 * N) - 1)) - 1);
+
+ idx = index & mask;
+ j = offset;
+ tmp = (N << 1) - 1;
+
+
+ if (((index >> tmp) & 1L) != 0L)
+ { /* if (((index >> ((2*N)-1)) & 1) == 1){ */
+ j += (1 << (N - 1)); /* j += (1<<(N-1)); */
+ }
+ dec_2p_2N1(idx, (int16)(N - 1), j, pos);
+
+ mask = ((1 << (N + 1)) - 1);
+ tmp = N << 1; /* idx = (index >> (2*N)) & mask; */
+ idx = (index >> tmp) & mask;
+
+ dec_1p_N1(idx, N, offset, pos + 2);
+
+ return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_4p_4N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+ int16 j, tmp;
+ int32 mask, idx;
+
+ /*-------------------------------------------------------*
+ * Decode 4 pulses with 4*N+1 bits: *
+ *-------------------------------------------------------*/
+ tmp = (N << 1) - 1;
+ mask = (1L << tmp) - 1L;
+ idx = index & mask;
+ j = offset;
+ tmp = (N << 1) - 1;
+
+
+ if (((index >> tmp) & 1L) != 0L)
+ { /* (((index >> ((2*N)-1)) & 1) == 1) */
+ j += (1 << (N - 1)); /* j += (1<<(N-1)); */
+ }
+ dec_2p_2N1(idx, (int16)(N - 1), j, pos);
+
+
+ tmp = (N << 1) + 1; /* mask = ((1<<((2*N)+1))-1); */
+ mask = (1L << tmp) - 1L;
+ idx = (index >> (N << 1)) & mask; /* idx = (index >> (2*N)) & mask; */
+ dec_2p_2N1(idx, N, offset, pos + 2); /* dec_2p_2N1(idx, N, offset, pos+2); */
+
+ return;
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_4p_4N(int32 index, int16 N, int16 offset, int16 pos[])
+{
+ int16 j, n_1, tmp;
+
+ /*-------------------------------------------------------*
+ * Decode 4 pulses with 4*N bits: *
+ *-------------------------------------------------------*/
+
+ n_1 = N - 1;
+ j = offset + (1 << n_1); /* j = offset + (1 << n_1); */
+
+ tmp = (N << 2) - 2;
+
+ switch ((index >> tmp) & 3)
+ { /* ((index >> ((4*N)-2)) & 3) */
+ case 0:
+ tmp = (n_1 << 2) + 1;
+
+ if ((index >> tmp) & 1)
+ { /* (((index >> ((4*n_1)+1)) & 1) == 0) */
+ dec_4p_4N1(index, n_1, j, pos);
+ }
+ else
+ {
+ dec_4p_4N1(index, n_1, offset, pos);
+ }
+ break;
+ case 1:
+ tmp = (3 * n_1) + 1; /* dec_1p_N1((index>>((3*n_1)+1)), n_1, offset, pos) */
+ dec_1p_N1(index >> tmp, n_1, offset, pos);
+ dec_3p_3N1(index, n_1, j, pos + 1);
+ break;
+ case 2:
+ tmp = (n_1 << 1) + 1; /* dec_2p_2N1((index>>((2*n_1)+1)), n_1, offset, pos); */
+ dec_2p_2N1(index >> tmp, n_1, offset, pos);
+ dec_2p_2N1(index, n_1, j, pos + 2);
+ break;
+ case 3:
+ tmp = n_1 + 1; /* dec_3p_3N1((index>>(n_1+1)), n_1, offset, pos); */
+ dec_3p_3N1(index >> tmp, n_1, offset, pos);
+ dec_1p_N1(index, n_1, j, pos + 3);
+ break;
+ }
+ return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_5p_5N(int32 index, int16 N, int16 offset, int16 pos[])
+{
+ int16 j, n_1, tmp;
+ int32 idx;
+
+ /*-------------------------------------------------------*
+ * Decode 5 pulses with 5*N bits: *
+ *-------------------------------------------------------*/
+
+ n_1 = (int16)(N - 1);
+ j = add_int16(offset, shl_int16(1, n_1)); /* j = offset + (1 << n_1); */
+ tmp = (N << 1) + 1; /* idx = (index >> ((2*N)+1)); */
+ idx = index >> tmp;
+ tmp = (5 * N) - 1; /* ((5*N)-1)) */
+
+
+ if ((index >> tmp) & 1) /* ((index >> ((5*N)-1)) & 1) */
+ {
+ dec_3p_3N1(idx, n_1, j, pos);
+ dec_2p_2N1(index, N, offset, pos + 3);
+ }
+ else
+ {
+ dec_3p_3N1(idx, n_1, offset, pos);
+ dec_2p_2N1(index, N, offset, pos + 3);
+ }
+ return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_6p_6N_2(int32 index, int16 N, int16 offset, int16 pos[])
+{
+ int16 j, n_1, offsetA, offsetB;
+
+ n_1 = N - 1;
+ j = offset + (1 << n_1); /* j = offset + (1 << n_1); */
+
+
+ /* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
+
+ offsetA = offsetB = j;
+
+ if (((index >> (6*N - 5)) & 1L) == 0)
+ { /* if (((index >> ((6*N)-5)) & 1) == 0) */
+ offsetA = offset;
+ }
+ else
+ {
+ offsetB = offset;
+ }
+
+
+ switch ((index >> (6*N - 4)) & 3)
+ { /* (index >> ((6*N)-4)) & 3 */
+ case 0:
+ dec_5p_5N(index >> N, n_1, offsetA, pos); /* dec_5p_5N(index>>N, n_1, offsetA, pos); */
+ dec_1p_N1(index, n_1, offsetA, pos + 5);
+ break;
+ case 1:
+ dec_5p_5N(index >> N, n_1, offsetA, pos); /* dec_5p_5N(index>>N, n_1, offsetA, pos); */
+ dec_1p_N1(index, n_1, offsetB, pos + 5);
+ break;
+ case 2:
+ dec_4p_4N(index >> (2*n_1 + 1), n_1, offsetA, pos); /* dec_4p_4N(index>>((2*n_1)+1 ), n_1, offsetA, pos); */
+ dec_2p_2N1(index, n_1, offsetB, pos + 4);
+ break;
+ case 3:
+ dec_3p_3N1(index >> (3*n_1 + 1), n_1, offset, pos); /* dec_3p_3N1(index>>((3*n_1)+ 1), n_1, offset, pos); */
+ dec_3p_3N1(index, n_1, j, pos + 3);
+ break;
+ }
+ return;
+}