Git init
[external/opencore-amr.git] / opencore / codecs_v2 / audio / gsm_amr / amr_nb / dec / src / wmf_to_ets.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
32
33
34  Filename: wmf_to_ets.cpp
35  Functions: wmf_to_ets
36
37 ------------------------------------------------------------------------------
38 */
39
40 /*----------------------------------------------------------------------------
41 ; INCLUDES
42 ----------------------------------------------------------------------------*/
43 #include "frame_type_3gpp.h"
44 #include "wmf_to_ets.h"
45 #include "typedef.h"
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 /*----------------------------------------------------------------------------
59 ; LOCAL FUNCTION DEFINITIONS
60 ; Function Prototype declaration
61 ----------------------------------------------------------------------------*/
62
63 /*----------------------------------------------------------------------------
64 ; LOCAL VARIABLE DEFINITIONS
65 ; Variable declaration - defined here and used outside this module
66 ----------------------------------------------------------------------------*/
67
68
69
70 /*
71 ------------------------------------------------------------------------------
72  FUNCTION NAME: wmf_to_ets
73 ------------------------------------------------------------------------------
74  INPUT AND OUTPUT DEFINITIONS
75
76  Inputs:
77     frame_type_3gpp = decoder speech bit rate (enum Frame_Type_3GPP)
78     wmf_input_ptr   = pointer to input encoded speech bits in WMF (non-IF2) format
79                      (Word8)
80     ets_output_ptr  = pointer to output encoded speech bits in ETS format (Word16)
81
82  Outputs:
83     ets_output_ptr  = pointer to encoded speech bits in the ETS format (Word16)
84
85  Returns:
86     None
87
88  Global Variables Used:
89     None
90
91  Local Variables Needed:
92     None
93
94 ------------------------------------------------------------------------------
95  FUNCTION DESCRIPTION
96
97  This function performs a transformation on the data buffers. It converts the
98  data format from WMF (non-IF2) (Wireless Multi-media Forum) to ETS (European
99  Telecommunication Standard). WMF format has the encoded speech bits byte
100  aligned with MSB to LSB going left to right. ETS format has the encoded speech
101  bits each separate with only one bit stored in each word.
102
103 ------------------------------------------------------------------------------
104  REQUIREMENTS
105
106  None
107
108 ------------------------------------------------------------------------------
109  REFERENCES
110
111 AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
112
113 ------------------------------------------------------------------------------
114  PSEUDO-CODE
115
116
117
118 ------------------------------------------------------------------------------
119  CAUTION [optional]
120  [State any special notes, constraints or cautions for users of this function]
121
122 ------------------------------------------------------------------------------
123 */
124
125 void wmf_to_ets(
126     enum Frame_Type_3GPP frame_type_3gpp,
127     UWord8   *wmf_input_ptr,
128     Word16   *ets_output_ptr,
129     CommonAmrTbls* common_amr_tbls)
130 {
131
132     Word16 i;
133     const Word16* const* reorderBits_ptr = common_amr_tbls->reorderBits_ptr;
134     const Word16* numOfBits_ptr = common_amr_tbls->numOfBits_ptr;
135
136     /*
137      * The following section of code accesses bits in the WMF method of
138      * bit ordering. Each bit is given its own location in the buffer pointed
139      * to by ets_output_ptr. If the frame_type_3gpp is less than MRDTX then
140      * the elements are reordered within the buffer pointed to by ets_output_ptr.
141      */
142
143     if (frame_type_3gpp < AMR_SID)
144     {
145         /* The table numOfBits[] can be found in bitreorder.c. */
146         for (i = numOfBits_ptr[frame_type_3gpp] - 1; i >= 0; i--)
147         {
148             /* The table reorderBits[][] can be found in bitreorder.c. */
149             ets_output_ptr[reorderBits_ptr[frame_type_3gpp][i]] =
150                 (wmf_input_ptr[i>>3] >> ((~i) & 0x7)) & 0x01;
151         }
152     }
153     else
154     {
155         /* The table numOfBits[] can be found in bitreorder.c. */
156         for (i = numOfBits_ptr[frame_type_3gpp] - 1; i >= 0; i--)
157         {
158             ets_output_ptr[i] = (wmf_input_ptr[i>>3] >> ((~i) & 0x7)) & 0x01;
159         }
160     }
161
162     return;
163 }