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
32 Pathname: ./audio/gsm-amr/c/src/ets_to_if2.c
33 Funtions: ets_to_if2
34
35 */
36
37 /*----------------------------------------------------------------------------
38 ; INCLUDES
39 ----------------------------------------------------------------------------*/
40 #include "frame_type_3gpp.h"
41 #include "ets_to_if2.h"
42 #include "typedef.h"
43 #include "bitreorder_tab.h"
44
45 /*----------------------------------------------------------------------------
46 ; MACROS
47 ; Define module specific macros here
48 ----------------------------------------------------------------------------*/
49
50 /*----------------------------------------------------------------------------
51 ; DEFINES
52 ; Include all pre-processor statements here. Include conditional
53 ; compile variables also.
54 ----------------------------------------------------------------------------*/
55
56 /*----------------------------------------------------------------------------
57 ; LOCAL FUNCTION DEFINITIONS
58 ; Function Prototype declaration
59 ----------------------------------------------------------------------------*/
60
61 /*----------------------------------------------------------------------------
62 ; LOCAL VARIABLE DEFINITIONS
63 ; Variable declaration - defined here and used outside this module
64 ----------------------------------------------------------------------------*/
65
66
67 /*
68 ------------------------------------------------------------------------------
69 FUNCTION NAME: ets_to_if2
70 ------------------------------------------------------------------------------
71 INPUT AND OUTPUT DEFINITIONS
72
73 Inputs:
74 frame_type_3gpp = decoder speech bit rate (enum Frame_Type_3GPP)
75 ets_input_ptr = pointer to input encoded speech bits in ETS format (Word16)
76 if2_output_ptr = pointer to output encoded speech bits in IF2 format (UWord8)
77
78 Outputs:
79 if2_output_ptr = pointer to encoded speech bits in the IF2 format (UWord8)
80
81 Returns:
82 None
83
84 Global Variables Used:
85 None
86
87 Local Variables Needed:
88 None
89
90 ------------------------------------------------------------------------------
91 FUNCTION DESCRIPTION
92
93 This function performs a transformation on the data buffers. It converts the
94 data format from ETS (European Telecommunication Standard) to IF2. ETS format
95 has the encoded speech bits each separate with only one bit stored in each
96 word. IF2 is the storage format where the frame type is in the first four bits
97 of the first byte. The upper four bits of that byte contain the first four
98 encoded speech bits for the frame. The following bytes contain the rest of
99 the encoded speech bits. The final byte has padded zeros to make the frame
100 byte aligned.
101 ------------------------------------------------------------------------------
102 REQUIREMENTS
103
104 None
105
106 ------------------------------------------------------------------------------
107 REFERENCES
108
109 AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
110
111 ------------------------------------------------------------------------------
112 PSEUDO-CODE
113
114
115
116 ------------------------------------------------------------------------------
117 RESOURCES USED [optional]
118
119 When the code is written for a specific target processor the
120 the resources used should be documented below.
121
122 HEAP MEMORY USED: x bytes
123
124 STACK MEMORY USED: x bytes
125
126 CLOCK CYCLES: (cycle count equation for this function) + (variable
127 used to represent cycle count for each subroutine
128 called)
129 where: (cycle count variable) = cycle count for [subroutine
130 name]
131
132 ------------------------------------------------------------------------------
133 CAUTION [optional]
134 [State any special notes, constraints or cautions for users of this function]
135
136 ------------------------------------------------------------------------------
137 */
138
ets_to_if2(enum Frame_Type_3GPP frame_type_3gpp,Word16 * ets_input_ptr,UWord8 * if2_output_ptr)139 void ets_to_if2(
140 enum Frame_Type_3GPP frame_type_3gpp,
141 Word16 *ets_input_ptr,
142 UWord8 *if2_output_ptr)
143 {
144 Word16 i;
145 Word16 k;
146 Word16 j = 0;
147 Word16 *ptr_temp;
148 Word16 bits_left;
149 UWord8 accum;
150
151 if (frame_type_3gpp < AMR_SID)
152 {
153 if2_output_ptr[j++] = (UWord8)(frame_type_3gpp) |
154 (ets_input_ptr[reorderBits[frame_type_3gpp][0]] << 4) |
155 (ets_input_ptr[reorderBits[frame_type_3gpp][1]] << 5) |
156 (ets_input_ptr[reorderBits[frame_type_3gpp][2]] << 6) |
157 (ets_input_ptr[reorderBits[frame_type_3gpp][3]] << 7);
158
159 for (i = 4; i < numOfBits[frame_type_3gpp] - 7;)
160 {
161 if2_output_ptr[j] =
162 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]];
163 if2_output_ptr[j] |=
164 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 1;
165 if2_output_ptr[j] |=
166 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 2;
167 if2_output_ptr[j] |=
168 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 3;
169 if2_output_ptr[j] |=
170 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 4;
171 if2_output_ptr[j] |=
172 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 5;
173 if2_output_ptr[j] |=
174 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 6;
175 if2_output_ptr[j++] |=
176 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 7;
177 }
178
179 bits_left = 4 + numOfBits[frame_type_3gpp] -
180 ((4 + numOfBits[frame_type_3gpp]) & 0xFFF8);
181
182 if (bits_left != 0)
183 {
184 if2_output_ptr[j] = 0;
185
186 for (k = 0; k < bits_left; k++)
187 {
188 if2_output_ptr[j] |=
189 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << k;
190 }
191 }
192 }
193 else
194 {
195 if (frame_type_3gpp != AMR_NO_DATA)
196 {
197 /* First octet contains 3GPP frame type and */
198 /* first 4 bits of encoded parameters */
199 if2_output_ptr[j++] = (UWord8)(frame_type_3gpp) |
200 (ets_input_ptr[0] << 4) | (ets_input_ptr[1] << 5) |
201 (ets_input_ptr[2] << 6) | (ets_input_ptr[3] << 7);
202 ptr_temp = &ets_input_ptr[4];
203
204 bits_left = ((4 + numOfBits[frame_type_3gpp]) & 0xFFF8);
205
206 for (i = (bits_left - 7) >> 3; i > 0; i--)
207 {
208 accum = (UWord8) * (ptr_temp++);
209 accum |= (UWord8) * (ptr_temp++) << 1;
210 accum |= (UWord8) * (ptr_temp++) << 2;
211 accum |= (UWord8) * (ptr_temp++) << 3;
212 accum |= (UWord8) * (ptr_temp++) << 4;
213 accum |= (UWord8) * (ptr_temp++) << 5;
214 accum |= (UWord8) * (ptr_temp++) << 6;
215 accum |= (UWord8) * (ptr_temp++) << 7;
216
217 if2_output_ptr[j++] = accum;
218 }
219
220 bits_left = 4 + numOfBits[frame_type_3gpp] - bits_left;
221
222 if (bits_left != 0)
223 {
224 if2_output_ptr[j] = 0;
225
226 for (i = 0; i < bits_left; i++)
227 {
228 if2_output_ptr[j] |= (ptr_temp[i] << i);
229 }
230 }
231 }
232 else
233 {
234 /* When there is no data, LSnibble of first octet */
235 /* is the 3GPP frame type, MSnibble is zeroed out */
236 if2_output_ptr[j++] = (UWord8)(frame_type_3gpp);
237 }
238
239 }
240
241 return;
242 }
243