Initialize Tizen 2.3
[external/opencore-amr.git] / opencore / codecs_v2 / audio / gsm_amr / amr_nb / common / src / sub.cpp
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20
21     3GPP TS 26.073
22     ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23     Available from http://www.3gpp.org
24
25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30
31  Filename: sub.cpp
32
33 ------------------------------------------------------------------------------
34  MODULE DESCRIPTION
35
36  Subtraction function with overflow control
37
38 ------------------------------------------------------------------------------
39 */
40
41 /*----------------------------------------------------------------------------
42 ; INCLUDES
43 ----------------------------------------------------------------------------*/
44 #include    "basic_op.h"
45
46 /*----------------------------------------------------------------------------
47 ; MACROS
48 ; [Define module specific macros here]
49 ----------------------------------------------------------------------------*/
50
51 /*----------------------------------------------------------------------------
52 ; DEFINES
53 ; [Include all pre-processor statements here. Include conditional
54 ; compile variables also.]
55 ----------------------------------------------------------------------------*/
56
57 /*----------------------------------------------------------------------------
58 ; LOCAL FUNCTION DEFINITIONS
59 ; [List function prototypes here]
60 ----------------------------------------------------------------------------*/
61
62 /*----------------------------------------------------------------------------
63 ; LOCAL VARIABLE DEFINITIONS
64 ; [Variable declaration - defined here and used outside this module]
65 ----------------------------------------------------------------------------*/
66
67
68 /*
69 ------------------------------------------------------------------------------
70  FUNCTION NAME: sub
71 ------------------------------------------------------------------------------
72  INPUT AND OUTPUT DEFINITIONS
73
74  Inputs:
75     var1 = 16 bit short signed integer (Word16) whose value falls in
76            the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
77
78     var2 = 16 bit short signed integer (Word16) whose value falls in
79            the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
80
81     pOverflow = pointer to overflow (Flag)
82
83  Outputs:
84     pOverflow -> 1 if the subtract operation resulted in overflow
85
86  Returns:
87     diff = 16-bit limited difference between var1 and var2 (Word16)
88
89  Global Variables Used:
90     None
91
92  Local Variables Needed:
93     None
94
95 ------------------------------------------------------------------------------
96  FUNCTION DESCRIPTION
97
98  This function performs the subtraction (var1-var2) with overflow control and
99  saturation; the 16 bit result is set at +32767 when overflow occurs or at
100  -32768 when underflow occurs.
101
102 ------------------------------------------------------------------------------
103  REQUIREMENTS
104
105  None
106
107 ------------------------------------------------------------------------------
108  REFERENCES
109
110  [1] sub() function in basicop2.c, UMTS GSM AMR speech codec, R99 -
111  Version 3.2.0, March 2, 2001
112
113 ------------------------------------------------------------------------------
114
115  PSEUDO-CODE
116
117  Word16 sub (Word16 var1, Word16 var2)
118  {
119     Word16 var_out;
120     Word32 diff;
121
122     diff = (Word32) var1 - var2;
123
124 * The reference ETSI code uses a global flag for Overflow inside the function
125 * saturate(). In the actual implementation a pointer to Overflow flag is passed
126 * in as a parameter to the function
127
128     var_out = saturate (diff);
129
130  #if (WMOPS)
131     multiCounter[currCounter].sub++;
132  #endif
133
134     return (var_out);
135  }
136
137 ------------------------------------------------------------------------------
138  CAUTION [optional]
139  [State any special notes, constraints or cautions for users of this function]
140
141 ------------------------------------------------------------------------------
142 */
143
144 /*----------------------------------------------------------------------------
145 ; FUNCTION CODE
146 ----------------------------------------------------------------------------*/
147
148 OSCL_EXPORT_REF Word16 sub(Word16 var1, Word16 var2, Flag *pOverflow)
149 {
150
151     Word32 diff;
152
153     diff = (Word32) var1 - var2;
154
155     /* Saturate result (if necessary). */
156     /* Replaced function call with in-line code             */
157     /*  to conserve MIPS, i.e., var_out = saturate (diff)  */
158
159
160     if ((UWord32)(diff + 32768) > 0x000FFFF)
161     {
162         if (diff > (Word32) 0x0007FFFL)
163         {
164             diff = MAX_16;
165         }
166         else
167         {
168             diff = MIN_16;
169         }
170
171         *pOverflow = 1;
172     }
173
174
175     return ((Word16) diff);
176 }