summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op.h
blob: df239d2ce8281be6f626fabd1030295790f4cc5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/* ------------------------------------------------------------------
 * 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.
****************************************************************************************/
/*
------------------------------------------------------------------------------



 Pathname: ./src/pvamrwbdecoder_basic_op.h

     Date: 05/07/2007

------------------------------------------------------------------------------
 REVISION HISTORY

 Description:
------------------------------------------------------------------------------
 INCLUDE DESCRIPTION

------------------------------------------------------------------------------
*/


#ifndef PVAMRWBDECODER_BASIC_OP_H
#define PVAMRWBDECODER_BASIC_OP_H


#include "normalize_amr_wb.h"


#define MAX_32 (int32)0x7fffffffL
#define MIN_32 (int32)0x80000000L

#define MAX_16 (int16)+32767    /* 0x7fff */
#define MIN_16 (int16)-32768    /* 0x8000 */




/*----------------------------------------------------------------------------
     Function Name : negate_int16

     Negate var1 with saturation, saturate in the case where input is -32768:
                  negate(var1) = sub(0,var1).

     Inputs :
      var1
               16 bit short signed integer (int16) whose value falls in the
               range : 0x8000 <= var1 <= 0x7fff.

     Outputs :
      none

     Return Value :
               16 bit short signed integer (int16) whose value falls in the
               range : 0x8000 <= var_out <= 0x7fff.
 ----------------------------------------------------------------------------*/

__inline int16 negate_int16(int16 var1)
{
    return (((var1 == MIN_16) ? MAX_16 : -var1));
}


/*----------------------------------------------------------------------------

     Function Name : shl_int16

     Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill
     the var2 LSB of the result. If var2 is negative, arithmetically shift
     var1 right by -var2 with sign extension. Saturate the result in case of
     underflows or overflows.

     Inputs :
      var1
               16 bit short signed integer (int16) whose value falls in the
               range : 0x8000 <= var1 <= 0x7fff.

      var2
               16 bit short signed integer (int16) whose value falls in the
               range : 0x8000 <= var1 <= 0x7fff.

     Return Value :
      var_out
               16 bit short signed integer (int16) whose value falls in the
               range : 0x8000 <= var_out <= 0x7fff.
 ----------------------------------------------------------------------------*/

__inline int16 shl_int16(int16 var1, int16 var2)
{
    int16 var_out;

    if (var2 < 0)
    {
        var2 = (-var2) & (0xf);
        var_out = var1 >> var2;
    }
    else
    {
        var2 &= 0xf;
        var_out = var1 << var2;
        if (var_out >> var2 != var1)
        {
            var_out = (var1 >> 15) ^ MAX_16;
        }
    }
    return (var_out);
}


/*----------------------------------------------------------------------------

     Function Name : shl_int32

     Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero
     fill the var2 LSB of the result. If var2 is negative, arithmetically
     shift L_var1 right by -var2 with sign extension. Saturate the result in
     case of underflows or overflows.

     Inputs :
      L_var1   32 bit long signed integer (int32) whose value falls in the
               range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.

      var2
               16 bit short signed integer (int16) whose value falls in the
               range :  8000 <= var2 <= 7fff.
     Return Value :
               32 bit long signed integer (int32) whose value falls in the
               range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.

 ----------------------------------------------------------------------------*/

__inline int32 shl_int32(int32 L_var1, int16 var2)
{
    int32 L_var_out;

    if (var2 > 0)
    {
        L_var_out = L_var1 << var2;
        if (L_var_out >> var2 != L_var1)
        {
            L_var_out = (L_var1 >> 31) ^ MAX_32;
        }
    }
    else
    {
        var2 = (-var2) & (0xf);
        L_var_out = L_var1 >> var2;
    }

    return (L_var_out);
}


/*----------------------------------------------------------------------------

     Function Name : shr_int32

     Arithmetically shift the 32 bit input L_var1 right var2 positions with
     sign extension. If var2 is negative, arithmetically shift L_var1 left
     by -var2 and zero fill the -var2 LSB of the result. Saturate the result
     in case of underflows or overflows.

     Inputs :
      L_var1   32 bit long signed integer (int32) whose value falls in the
               range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.

      var2
               16 bit short signed integer (int16) whose value falls in the
               range :  8000 <= var2 <= 7fff.
     Return Value :
               32 bit long signed integer (int32) whose value falls in the
               range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.

 ----------------------------------------------------------------------------*/

__inline int32 shr_int32(int32 L_var1, int16 var2)
{
    int32 L_var_out;

    if (var2 >= 0)
    {
        L_var_out = L_var1 >> (var2 & 0x1f);
    }
    else
    {
        var2 = (int16)(-var2);
        var2 &= 0x1f;
        L_var_out = L_var1 << var2;
        if (L_var_out >> var2 != L_var1)
        {
            L_var_out = (L_var1 >> 31) ^ MAX_32;
        }

    }
    return (L_var_out);
}






#if defined(PV_ARM_V5)

#include "pvamrwbdecoder_basic_op_armv5.h"

#elif defined(PV_ARM_GCC_V5)

#include "pvamrwbdecoder_basic_op_gcc_armv5.h"

#else

#ifndef C_EQUIVALENT
#define C_EQUIVALENT        // default to C_EQUIVALENT
#endif

#include "pvamrwbdecoder_basic_op_cequivalent.h"

#endif


#endif   /*  PVAMRWBDECODER_BASIC_OP_H  */