ets_to_wmf.cpp revision b841f14f8e51f2365945281fbfa54ef6a1b1b5a6
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/****************************************************************************************
19Portions 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)
26Permission to distribute, modify and use this file under the standard license
27terms listed above has been obtained from the copyright holder.
28****************************************************************************************/
29/*
30------------------------------------------------------------------------------
31
32
33
34 Pathname: ./audio/gsm-amr/c/src/ets_to_wmf.c
35 Funtions: ets_to_wmf
36
37     Date: 01/23/2002
38
39------------------------------------------------------------------------------
40 REVISION HISTORY
41
42 Description: Modified code as per review comments regarding things such as
43              adding the tables in bitreorder_tab.c to the Global section of
44              the input/output section of the template and removing the #define
45              of 244 since it wasn't needed in this function.
46
47 Description: Fixed the loop that packs the last octet of the WMF output.
48
49 Description:  Replaced "int" and/or "char" with OSCL defined types.
50
51 Description:
52
53------------------------------------------------------------------------------
54*/
55
56/*----------------------------------------------------------------------------
57; INCLUDES
58----------------------------------------------------------------------------*/
59#include "ets_to_wmf.h"
60#include "typedef.h"
61#include "bitreorder_tab.h"
62
63/*----------------------------------------------------------------------------
64; MACROS
65; Define module specific macros here
66----------------------------------------------------------------------------*/
67
68/*----------------------------------------------------------------------------
69; DEFINES
70; Include all pre-processor statements here. Include conditional
71; compile variables also.
72----------------------------------------------------------------------------*/
73
74
75/*----------------------------------------------------------------------------
76; LOCAL FUNCTION DEFINITIONS
77; Function Prototype declaration
78----------------------------------------------------------------------------*/
79
80/*----------------------------------------------------------------------------
81; LOCAL VARIABLE DEFINITIONS
82; Variable declaration - defined here and used outside this module
83----------------------------------------------------------------------------*/
84
85
86/*
87------------------------------------------------------------------------------
88 FUNCTION NAME: ets_to_wmf
89------------------------------------------------------------------------------
90 INPUT AND OUTPUT DEFINITIONS
91
92 Inputs:
93    frame_type_3gpp = decoder speech bit rate (enum Frame_Type_3GPP)
94    ets_input_ptr   = pointer to input encoded speech bits in ETS format (Word16)
95    wmf_output_ptr  = pointer to output encoded speech bits in WMF format(UWord8)
96
97 Outputs:
98    wmf_output_ptr  = pointer to encoded speech bits in the WMF format (UWord8)
99
100 Returns:
101    None
102
103 Global Variables Used:
104    numOfBits = table of values that describe the number of bits per frame for
105                each 3GPP frame type mode. The table is type const Word16 and has
106                NUM_MODES elements. This table is located in bitreorder_tab.c.
107    reorderBits = table of pointers that point to tables used to reorder the
108                  encoded speech bits when converting from ETS to WMF or IF2
109                  format. The table is of type const Word16 * and contains
110                  NUM_MODES-1 elements. This table is located in bitreorder_tab.c.
111
112 Local Variables Needed:
113    None
114
115------------------------------------------------------------------------------
116 FUNCTION DESCRIPTION
117
118 This function performs a transformation on the data buffers. It converts the
119 data format from ETS (European Telecommunication Standard) to WMF (wireless
120 multimedia forum). ETS format has the encoded speech bits each separate with
121 only one bit stored in each word. WMF is the storage format where the frame
122 type is in the first four bits of the first byte. This first byte has the
123 upper four bits as padded zeroes. The following bytes contain the rest of the
124 encoded speech bits. The final byte has padded zeros to make the frame byte
125 aligned.
126------------------------------------------------------------------------------
127 REQUIREMENTS
128
129 None
130
131------------------------------------------------------------------------------
132 REFERENCES
133
134 None
135
136------------------------------------------------------------------------------
137 PSEUDO-CODE
138
139
140
141------------------------------------------------------------------------------
142 RESOURCES USED [optional]
143
144 When the code is written for a specific target processor the
145 the resources used should be documented below.
146
147 HEAP MEMORY USED: x bytes
148
149 STACK MEMORY USED: x bytes
150
151 CLOCK CYCLES: (cycle count equation for this function) + (variable
152                used to represent cycle count for each subroutine
153                called)
154     where: (cycle count variable) = cycle count for [subroutine
155                                     name]
156
157------------------------------------------------------------------------------
158 CAUTION [optional]
159 [State any special notes, constraints or cautions for users of this function]
160
161------------------------------------------------------------------------------
162*/
163
164void ets_to_wmf(
165    enum Frame_Type_3GPP frame_type_3gpp,
166    Word16 *ets_input_ptr,
167    UWord8 *wmf_output_ptr)
168{
169    Word16  i;
170    Word16  k = 0;
171    Word16  j = 0;
172    Word16 *ptr_temp;
173    Word16  bits_left;
174    UWord8  accum;
175
176    if (frame_type_3gpp < AMR_SID)
177    {
178        wmf_output_ptr[j++] = (UWord8)(frame_type_3gpp) & 0x0f;
179
180        for (i = 0; i < numOfBits[frame_type_3gpp] - 7;)
181        {
182            wmf_output_ptr[j]  =
183                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 7;
184            wmf_output_ptr[j] |=
185                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 6;
186            wmf_output_ptr[j] |=
187                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 5;
188            wmf_output_ptr[j] |=
189                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 4;
190            wmf_output_ptr[j] |=
191                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 3;
192            wmf_output_ptr[j] |=
193                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 2;
194            wmf_output_ptr[j] |=
195                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 1;
196            wmf_output_ptr[j++] |=
197                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]];
198        }
199
200        bits_left = numOfBits[frame_type_3gpp] -
201                    (numOfBits[frame_type_3gpp] & 0xFFF8);
202
203        wmf_output_ptr[j] = 0;
204
205        for (k = 0; k < bits_left; k++)
206        {
207            wmf_output_ptr[j] |=
208                (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << (7 - k);
209
210        }
211    }
212    else
213    {
214        wmf_output_ptr[j++] = (UWord8)(frame_type_3gpp) & 0x0f;
215
216        ptr_temp = &ets_input_ptr[0];
217
218        for (i = numOfBits[frame_type_3gpp] - 7; i > 0; i -= 8)
219        {
220            accum  = (UWord8) * (ptr_temp++) << 7;
221            accum |= (UWord8) * (ptr_temp++) << 6;
222            accum |= (UWord8) * (ptr_temp++) << 5;
223            accum |= (UWord8) * (ptr_temp++) << 4;
224            accum |= (UWord8) * (ptr_temp++) << 3;
225            accum |= (UWord8) * (ptr_temp++) << 2;
226            accum |= (UWord8) * (ptr_temp++) << 1;
227            accum |= (UWord8) * (ptr_temp++);
228
229            wmf_output_ptr[j++] = accum;
230        }
231
232        bits_left = numOfBits[frame_type_3gpp] -
233                    (numOfBits[frame_type_3gpp] & 0xFFF8);
234
235        wmf_output_ptr[j] = 0;
236
237        for (i = 0; i < bits_left; i++)
238        {
239            wmf_output_ptr[j] |= *(ptr_temp++) << (7 - i);
240        }
241    }
242
243    return;
244}
245