summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/amrnb/enc/src/spstproc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/amrnb/enc/src/spstproc.cpp')
-rw-r--r--media/libstagefright/codecs/amrnb/enc/src/spstproc.cpp314
1 files changed, 314 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/amrnb/enc/src/spstproc.cpp b/media/libstagefright/codecs/amrnb/enc/src/spstproc.cpp
new file mode 100644
index 0000000..b9574aa
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/enc/src/spstproc.cpp
@@ -0,0 +1,314 @@
+/* ------------------------------------------------------------------
+ * 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.073
+ ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+ Available from http://www.3gpp.org
+
+(C) 2004, 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.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/spstproc.c
+ Functions: subframePostProc
+
+ Date: 02/06/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template.
+ Changed to accept the pOverflow flag for EPOC compatibility.
+
+ Description:
+ 1. Eliminated unused include files.
+ 2. Replaced array addressing by pointers
+ 3. Eliminated math operations that unnecessary checked for
+ saturation
+ 4. Replaced loop counter with decrement loops
+
+ Description: Added casting to eliminate warnings
+
+ Description: Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ Subframe post processing
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "spstproc.h"
+#include "syn_filt.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: subframePostProc
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+ Inputs:
+ speech -- Pointer to Word16 -- speech segment
+ mode -- enum Mode -- coder mode
+ i_subfr -- Word16 -- Subframe nr
+ gain_pit -- Word16 -- Pitch gain Q14
+ gain_code -- Word16 -- Decoded innovation gain
+ Aq -- Pointer to Word16 -- A(z) quantized for the 4 subframes
+ synth -- Word16 Array -- Local synthesis
+ xn -- Word16 Array -- Target vector for pitch search
+ code -- Word16 Array -- Fixed codebook exitation
+ y1 -- Word16 Array -- Filtered adaptive exitation
+ y2 -- Word16 Array -- Filtered fixed codebook excitation
+ mem_syn -- Pointer to Word16 -- memory of synthesis filter
+
+ Outputs:
+ mem_syn -- Pointer to Word16 -- memory of synthesis filter
+ mem_err -- Pointer to Word16 -- pointer to error signal
+ mem_w0 -- Pointer to Word16 -- memory of weighting filter
+ exc -- Pointer to Word16 -- long term prediction residual
+ sharp -- Pointer to Word16 -- pitch sharpening value
+ pOverflow -- Pointer to Flag -- overflow indicator
+
+ Returns:
+ None
+
+ Global Variables Used:
+ None
+
+ Local Variables Needed:
+ None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ spstproc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+ used to represent cycle count for each subroutine
+ called)
+ where: (cycle count variable) = cycle count for [subroutine
+ name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void subframePostProc(
+ Word16 *speech, /* i : speech segment */
+ enum Mode mode, /* i : coder mode */
+ Word16 i_subfr, /* i : Subframe nr */
+ Word16 gain_pit, /* i : Pitch gain Q14 */
+ Word16 gain_code, /* i : Decoded innovation gain */
+ Word16 *Aq, /* i : A(z) quantized for the 4 subframes */
+ Word16 synth[], /* i : Local snthesis */
+ Word16 xn[], /* i : Target vector for pitch search */
+ Word16 code[], /* i : Fixed codebook exitation */
+ Word16 y1[], /* i : Filtered adaptive exitation */
+ Word16 y2[], /* i : Filtered fixed codebook excitation */
+ Word16 *mem_syn, /* i/o : memory of synthesis filter */
+ Word16 *mem_err, /* o : pointer to error signal */
+ Word16 *mem_w0, /* o : memory of weighting filter */
+ Word16 *exc, /* o : long term prediction residual */
+ Word16 *sharp, /* o : pitch sharpening value */
+ Flag *pOverflow /* o : overflow indicator */
+)
+{
+ Word16 i;
+ Word16 j;
+ Word16 temp;
+ Word32 L_temp;
+ Word32 L_temp2;
+ Word16 tempShift;
+ Word16 kShift;
+ Word16 pitch_fac;
+ Word16 *p_exc;
+ Word16 *p_code;
+
+ OSCL_UNUSED_ARG(pOverflow);
+
+ if (mode != MR122)
+ {
+ tempShift = 1;
+ kShift = 16 - 2 - 1;
+ pitch_fac = gain_pit;
+ }
+ else
+ {
+ tempShift = 2;
+ kShift = 16 - 4 - 1;
+ pitch_fac = gain_pit >> 1;
+ }
+
+ /*------------------------------------------------------------*
+ * - Update pitch sharpening "sharp" with quantized gain_pit *
+ *------------------------------------------------------------*/
+
+ if (gain_pit < SHARPMAX)
+ {
+ *sharp = gain_pit;
+ }
+ else
+ {
+ *sharp = SHARPMAX;
+ }
+
+ /*------------------------------------------------------*
+ * - Find the total excitation *
+ * - find synthesis speech corresponding to exc[] *
+ * - update filters memories for finding the target *
+ * vector in the next subframe *
+ * (update error[-m..-1] and mem_w_err[]) *
+ *------------------------------------------------------*/
+
+ p_exc = &exc[ i_subfr];
+ p_code = &code[0];
+
+ for (i = L_SUBFR >> 1; i != 0 ; i--)
+ {
+ /* exc[i] = gain_pit*exc[i] + gain_code*code[i]; */
+
+ /*
+ * 12k2 others
+ * ---------------------------------
+ * exc Q0 Q0
+ * gain_pit Q14 Q14
+ * pitch_fac Q13 Q14
+ * product: Q14 Q15
+ *
+ * code Q12 Q13
+ * gain_code Q1 Q1
+ * product Q14 Q15
+ * sum Q14 Q15
+ *
+ * tempShift 2 1
+ * sum<<tempShift Q16 Q16
+ * result -> exc Q0 Q0
+ */
+ L_temp = ((Word32) * (p_exc++) * pitch_fac) << 1;
+ L_temp2 = ((Word32) * (p_exc--) * pitch_fac) << 1;
+ L_temp += ((Word32) * (p_code++) * gain_code) << 1;
+ L_temp2 += ((Word32) * (p_code++) * gain_code) << 1;
+ L_temp <<= tempShift;
+ L_temp2 <<= tempShift;
+ *(p_exc++) = (Word16)((L_temp + 0x08000L) >> 16);
+ *(p_exc++) = (Word16)((L_temp2 + 0x08000L) >> 16);
+
+ }
+
+ Syn_filt(
+ Aq,
+ &exc[i_subfr],
+ &synth[i_subfr],
+ L_SUBFR,
+ mem_syn,
+ 1);
+
+ for (i = L_SUBFR - M, j = 0; i < L_SUBFR; i++, j++)
+ {
+ mem_err[j] = speech[i_subfr + i] - synth[i_subfr + i];
+
+ /*
+ * 12k2 others
+ * ---------------------------------
+ * y1 Q0 Q0
+ * gain_pit Q14 Q14
+ * product Q15 Q15
+ * shifted prod. Q16 Q16
+ * temp Q0 Q0
+ *
+ * y2 Q10 Q12
+ * gain_code Q1 Q1
+ * product Q12 Q14
+ * kshift 4 2
+ * shifted prod. Q16 Q16
+ * k Q0 Q0
+ * mem_w0,xn,sum Q0 Q0
+ */
+
+ L_temp = ((Word32)y1[i] * gain_pit);
+ temp = (Word16)(L_temp >> 14);
+
+ L_temp = ((Word32)y2[i] * gain_code);
+ temp += (Word16)(L_temp >> kShift);
+
+ mem_w0[j] = xn[i] - temp;
+ }
+
+ return;
+}