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.173
22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23     Available from http://www.3gpp.org
24 
25 (C) 2007, 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  Pathname: ./src/mime_io.cpp
34 
35      Date: 05/07/2007
36 
37 ------------------------------------------------------------------------------
38  REVISION HISTORY
39 
40 
41  Description:
42 
43 ------------------------------------------------------------------------------
44  INPUT AND OUTPUT DEFINITIONS
45 
46  Inputs:
47     [input_variable_name] = [description of the input to module, its type
48                  definition, and length (when applicable)]
49 
50  Local Stores/Buffers/Pointers Needed:
51     [local_store_name] = [description of the local store, its type
52                   definition, and length (when applicable)]
53     [local_buffer_name] = [description of the local buffer, its type
54                    definition, and length (when applicable)]
55     [local_ptr_name] = [description of the local pointer, its type
56                 definition, and length (when applicable)]
57 
58  Global Stores/Buffers/Pointers Needed:
59     [global_store_name] = [description of the global store, its type
60                    definition, and length (when applicable)]
61     [global_buffer_name] = [description of the global buffer, its type
62                 definition, and length (when applicable)]
63     [global_ptr_name] = [description of the global pointer, its type
64                  definition, and length (when applicable)]
65 
66  Outputs:
67     [return_variable_name] = [description of data/pointer returned
68                   by module, its type definition, and length
69                   (when applicable)]
70 
71  Pointers and Buffers Modified:
72     [variable_bfr_ptr] points to the [describe where the
73       variable_bfr_ptr points to, its type definition, and length
74       (when applicable)]
75     [variable_bfr] contents are [describe the new contents of
76       variable_bfr]
77 
78  Local Stores Modified:
79     [local_store_name] = [describe new contents, its type
80                   definition, and length (when applicable)]
81 
82  Global Stores Modified:
83     [global_store_name] = [describe new contents, its type
84                    definition, and length (when applicable)]
85 
86 ------------------------------------------------------------------------------
87  FUNCTION DESCRIPTION
88 
89  [Describe what the module does by using the variable names
90  listed in the Input and Output Definitions Section above.]
91 
92 ------------------------------------------------------------------------------
93  REQUIREMENTS
94 
95  [List requirements to be satisfied by this module.]
96 
97 ------------------------------------------------------------------------------
98  REFERENCES
99 
100  [List all references used in designing this module.]
101 
102 ------------------------------------------------------------------------------
103  PSEUDO-CODE
104 
105  ------------------------------------------------------------------------------
106  RESOURCES USED
107 
108  STACK USAGE:
109 
110  DATA MEMORY USED: x words
111 
112  PROGRAM MEMORY USED: x words
113 
114  CLOCK CYCLES:
115 
116 ------------------------------------------------------------------------------
117 */
118 
119 
120 /*----------------------------------------------------------------------------
121 ; INCLUDES
122 ----------------------------------------------------------------------------*/
123 
124 #include "pv_amr_wb_type_defs.h"
125 #include "pvamrwbdecoder_api.h"
126 #include "pvamrwbdecoder.h"
127 #include "pvamrwbdecoder_mem_funcs.h"
128 #include "pvamrwbdecoder_cnst.h"
129 #include "dtx.h"
130 #include "mime_io.h"
131 
132 /*----------------------------------------------------------------------------
133 ; MACROS
134 ; Define module specific macros here
135 ----------------------------------------------------------------------------*/
136 
137 
138 /*----------------------------------------------------------------------------
139 ; DEFINES
140 ; Include all pre-processor statements here. Include conditional
141 ; compile variables also.
142 ----------------------------------------------------------------------------*/
143 
144 #define MRSID 9
145 
146 /*----------------------------------------------------------------------------
147 ; LOCAL FUNCTION DEFINITIONS
148 ; Function Prototype declaration
149 ----------------------------------------------------------------------------*/
150 
151 /*----------------------------------------------------------------------------
152 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
153 ; Variable declaration - defined here and used outside this module
154 ----------------------------------------------------------------------------*/
155 
156 const uint8 toc_byte[16] = {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C,
157                             0x44, 0x4C, 0x54, 0x5C, 0x64, 0x6C, 0x74, 0x7C
158                            };
159 
160 /* number of speech bits for all modes */
161 const int16 unpacked_size[16] =
162 {
163     132,  177, 253, 285,
164     317,  365, 397, 461,
165     477,   35,   0,   0,
166     0,    0,   0,   0
167 };
168 
169 /* size of packed frame for each mode, excluding TOC byte */
170 const int16 packed_size[16] = {17, 23, 32, 36, 40, 46, 50, 58,
171                                60,  5,  0,  0,  0,  0,  0,  0
172                               };
173 
174 /* number of unused speech bits in packed format for each mode */
175 const int16 unused_size[16] = {4, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0};
176 
177 /* sorting tables for all modes */
178 
179 const int16 sort_660[132] =
180 {
181     0,   5,   6,   7,  61,  84, 107, 130,  62,  85,
182     8,   4,  37,  38,  39,  40,  58,  81, 104, 127,
183     60,  83, 106, 129, 108, 131, 128,  41,  42,  80,
184     126,   1,   3,  57, 103,  82, 105,  59,   2,  63,
185     109, 110,  86,  19,  22,  23,  64,  87,  18,  20,
186     21,  17,  13,  88,  43,  89,  65, 111,  14,  24,
187     25,  26,  27,  28,  15,  16,  44,  90,  66, 112,
188     9,  11,  10,  12,  67, 113,  29,  30,  31,  32,
189     34,  33,  35,  36,  45,  51,  68,  74,  91,  97,
190     114, 120,  46,  69,  92, 115,  52,  75,  98, 121,
191     47,  70,  93, 116,  53,  76,  99, 122,  48,  71,
192     94, 117,  54,  77, 100, 123,  49,  72,  95, 118,
193     55,  78, 101, 124,  50,  73,  96, 119,  56,  79,
194     102, 125
195 };
196 
197 const int16 sort_885[177] =
198 {
199     0,   4,   6,   7,   5,   3,  47,  48,  49, 112,
200     113, 114,  75, 106, 140, 171,  80, 111, 145, 176,
201     77, 108, 142, 173,  78, 109, 143, 174,  79, 110,
202     144, 175,  76, 107, 141, 172,  50, 115,  51,   2,
203     1,  81, 116, 146,  19,  21,  12,  17,  18,  20,
204     16,  25,  13,  10,  14,  24,  23,  22,  26,   8,
205     15,  52, 117,  31,  82, 147,   9,  33,  11,  83,
206     148,  53, 118,  28,  27,  84, 149,  34,  35,  29,
207     46,  32,  30,  54, 119,  37,  36,  39,  38,  40,
208     85, 150,  41,  42,  43,  44,  45,  55,  60,  65,
209     70,  86,  91,  96, 101, 120, 125, 130, 135, 151,
210     156, 161, 166,  56,  87, 121, 152,  61,  92, 126,
211     157,  66,  97, 131, 162,  71, 102, 136, 167,  57,
212     88, 122, 153,  62,  93, 127, 158,  67,  98, 132,
213     163,  72, 103, 137, 168,  58,  89, 123, 154,  63,
214     94, 128, 159,  68,  99, 133, 164,  73, 104, 138,
215     169,  59,  90, 124, 155,  64,  95, 129, 160,  69,
216     100, 134, 165,  74, 105, 139, 170
217 };
218 
219 const int16 sort_1265[253] =
220 {
221     0,   4,   6,  93, 143, 196, 246,   7,   5,   3,
222     47,  48,  49,  50,  51, 150, 151, 152, 153, 154,
223     94, 144, 197, 247,  99, 149, 202, 252,  96, 146,
224     199, 249,  97, 147, 200, 250, 100, 203,  98, 148,
225     201, 251,  95, 145, 198, 248,  52,   2,   1, 101,
226     204, 155,  19,  21,  12,  17,  18,  20,  16,  25,
227     13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
228     156,  31, 102, 205,   9,  33,  11, 103, 206,  54,
229     157,  28,  27, 104, 207,  34,  35,  29,  46,  32,
230     30,  55, 158,  37,  36,  39,  38,  40, 105, 208,
231     41,  42,  43,  44,  45,  56, 106, 159, 209,  57,
232     66,  75,  84, 107, 116, 125, 134, 160, 169, 178,
233     187, 210, 219, 228, 237,  58, 108, 161, 211,  62,
234     112, 165, 215,  67, 117, 170, 220,  71, 121, 174,
235     224,  76, 126, 179, 229,  80, 130, 183, 233,  85,
236     135, 188, 238,  89, 139, 192, 242,  59, 109, 162,
237     212,  63, 113, 166, 216,  68, 118, 171, 221,  72,
238     122, 175, 225,  77, 127, 180, 230,  81, 131, 184,
239     234,  86, 136, 189, 239,  90, 140, 193, 243,  60,
240     110, 163, 213,  64, 114, 167, 217,  69, 119, 172,
241     222,  73, 123, 176, 226,  78, 128, 181, 231,  82,
242     132, 185, 235,  87, 137, 190, 240,  91, 141, 194,
243     244,  61, 111, 164, 214,  65, 115, 168, 218,  70,
244     120, 173, 223,  74, 124, 177, 227,  79, 129, 182,
245     232,  83, 133, 186, 236,  88, 138, 191, 241,  92,
246     142, 195, 245
247 };
248 
249 const int16 sort_1425[285] =
250 {
251     0,   4,   6, 101, 159, 220, 278,   7,   5,   3,
252     47,  48,  49,  50,  51, 166, 167, 168, 169, 170,
253     102, 160, 221, 279, 107, 165, 226, 284, 104, 162,
254     223, 281, 105, 163, 224, 282, 108, 227, 106, 164,
255     225, 283, 103, 161, 222, 280,  52,   2,   1, 109,
256     228, 171,  19,  21,  12,  17,  18,  20,  16,  25,
257     13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
258     172,  31, 110, 229,   9,  33,  11, 111, 230,  54,
259     173,  28,  27, 112, 231,  34,  35,  29,  46,  32,
260     30,  55, 174,  37,  36,  39,  38,  40, 113, 232,
261     41,  42,  43,  44,  45,  56, 114, 175, 233,  62,
262     120, 181, 239,  75, 133, 194, 252,  57, 115, 176,
263     234,  63, 121, 182, 240,  70, 128, 189, 247,  76,
264     134, 195, 253,  83, 141, 202, 260,  92, 150, 211,
265     269,  84, 142, 203, 261,  93, 151, 212, 270,  85,
266     143, 204, 262,  94, 152, 213, 271,  86, 144, 205,
267     263,  95, 153, 214, 272,  64, 122, 183, 241,  77,
268     135, 196, 254,  65, 123, 184, 242,  78, 136, 197,
269     255,  87, 145, 206, 264,  96, 154, 215, 273,  58,
270     116, 177, 235,  66, 124, 185, 243,  71, 129, 190,
271     248,  79, 137, 198, 256,  88, 146, 207, 265,  97,
272     155, 216, 274,  59, 117, 178, 236,  67, 125, 186,
273     244,  72, 130, 191, 249,  80, 138, 199, 257,  89,
274     147, 208, 266,  98, 156, 217, 275,  60, 118, 179,
275     237,  68, 126, 187, 245,  73, 131, 192, 250,  81,
276     139, 200, 258,  90, 148, 209, 267,  99, 157, 218,
277     276,  61, 119, 180, 238,  69, 127, 188, 246,  74,
278     132, 193, 251,  82, 140, 201, 259,  91, 149, 210,
279     268, 100, 158, 219, 277
280 };
281 
282 const int16 sort_1585[317] =
283 {
284     0,   4,   6, 109, 175, 244, 310,   7,   5,   3,
285     47,  48,  49,  50,  51, 182, 183, 184, 185, 186,
286     110, 176, 245, 311, 115, 181, 250, 316, 112, 178,
287     247, 313, 113, 179, 248, 314, 116, 251, 114, 180,
288     249, 315, 111, 177, 246, 312,  52,   2,   1, 117,
289     252, 187,  19,  21,  12,  17,  18,  20,  16,  25,
290     13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
291     188,  31, 118, 253,   9,  33,  11, 119, 254,  54,
292     189,  28,  27, 120, 255,  34,  35,  29,  46,  32,
293     30,  55, 190,  37,  36,  39,  38,  40, 121, 256,
294     41,  42,  43,  44,  45,  56, 122, 191, 257,  63,
295     129, 198, 264,  76, 142, 211, 277,  89, 155, 224,
296     290, 102, 168, 237, 303,  57, 123, 192, 258,  70,
297     136, 205, 271,  83, 149, 218, 284,  96, 162, 231,
298     297,  62, 128, 197, 263,  75, 141, 210, 276,  88,
299     154, 223, 289, 101, 167, 236, 302,  58, 124, 193,
300     259,  71, 137, 206, 272,  84, 150, 219, 285,  97,
301     163, 232, 298,  59, 125, 194, 260,  64, 130, 199,
302     265,  67, 133, 202, 268,  72, 138, 207, 273,  77,
303     143, 212, 278,  80, 146, 215, 281,  85, 151, 220,
304     286,  90, 156, 225, 291,  93, 159, 228, 294,  98,
305     164, 233, 299, 103, 169, 238, 304, 106, 172, 241,
306     307,  60, 126, 195, 261,  65, 131, 200, 266,  68,
307     134, 203, 269,  73, 139, 208, 274,  78, 144, 213,
308     279,  81, 147, 216, 282,  86, 152, 221, 287,  91,
309     157, 226, 292,  94, 160, 229, 295,  99, 165, 234,
310     300, 104, 170, 239, 305, 107, 173, 242, 308,  61,
311     127, 196, 262,  66, 132, 201, 267,  69, 135, 204,
312     270,  74, 140, 209, 275,  79, 145, 214, 280,  82,
313     148, 217, 283,  87, 153, 222, 288,  92, 158, 227,
314     293,  95, 161, 230, 296, 100, 166, 235, 301, 105,
315     171, 240, 306, 108, 174, 243, 309
316 };
317 
318 const int16 sort_1825[365] =
319 {
320     0,   4,   6, 121, 199, 280, 358,   7,   5,   3,
321     47,  48,  49,  50,  51, 206, 207, 208, 209, 210,
322     122, 200, 281, 359, 127, 205, 286, 364, 124, 202,
323     283, 361, 125, 203, 284, 362, 128, 287, 126, 204,
324     285, 363, 123, 201, 282, 360,  52,   2,   1, 129,
325     288, 211,  19,  21,  12,  17,  18,  20,  16,  25,
326     13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
327     212,  31, 130, 289,   9,  33,  11, 131, 290,  54,
328     213,  28,  27, 132, 291,  34,  35,  29,  46,  32,
329     30,  55, 214,  37,  36,  39,  38,  40, 133, 292,
330     41,  42,  43,  44,  45,  56, 134, 215, 293, 198,
331     299, 136, 120, 138,  60, 279,  58,  62, 357, 139,
332     140, 295, 156,  57, 219, 297,  63, 217, 137, 170,
333     300, 222,  64, 106,  61,  78, 294,  92, 142, 141,
334     135, 221, 296, 301, 343,  59, 298, 184, 329, 315,
335     220, 216, 265, 251, 218, 237, 352, 223, 157,  86,
336     171,  87, 164, 351, 111, 302,  65, 178, 115, 323,
337     72, 192, 101, 179,  93,  73, 193, 151, 337, 309,
338     143, 274,  69, 324, 165, 150,  97, 338, 110, 310,
339     330, 273,  68, 107, 175, 245, 114,  79, 113, 189,
340     246, 259, 174,  71, 185,  96, 344, 100, 322,  83,
341     334, 316, 333, 252, 161, 348, 147,  82, 269, 232,
342     260, 308, 353, 347, 163, 231, 306, 320, 188, 270,
343     146, 177, 266, 350, 256,  85, 149, 116, 191, 160,
344     238, 258, 336, 305, 255,  88, 224,  99, 339, 230,
345     228, 227, 272, 242, 241, 319, 233, 311, 102,  74,
346     180, 275,  66, 194, 152, 325, 172, 247, 244, 261,
347     117, 158, 166, 354,  75, 144, 108, 312,  94, 186,
348     303,  80, 234,  89, 195, 112, 340, 181, 345, 317,
349     326, 276, 239, 167, 118, 313,  70, 355, 327, 253,
350     190, 176, 271, 104,  98, 153, 103,  90,  76, 267,
351     277, 248, 225, 262, 182,  84, 154, 235, 335, 168,
352     331, 196, 341, 249, 162, 307, 148, 349, 263, 321,
353     257, 243, 229, 356, 159, 119,  67, 187, 173, 145,
354     240,  77, 304, 332, 314, 342, 109, 254,  81, 278,
355     105,  91, 346, 318, 183, 250, 197, 328,  95, 155,
356     169, 268, 226, 236, 264
357 };
358 
359 const int16 sort_1985[397] =
360 {
361     0,   4,   6, 129, 215, 304, 390,   7,   5,   3,
362     47,  48,  49,  50,  51, 222, 223, 224, 225, 226,
363     130, 216, 305, 391, 135, 221, 310, 396, 132, 218,
364     307, 393, 133, 219, 308, 394, 136, 311, 134, 220,
365     309, 395, 131, 217, 306, 392,  52,   2,   1, 137,
366     312, 227,  19,  21,  12,  17,  18,  20,  16,  25,
367     13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
368     228,  31, 138, 313,   9,  33,  11, 139, 314,  54,
369     229,  28,  27, 140, 315,  34,  35,  29,  46,  32,
370     30,  55, 230,  37,  36,  39,  38,  40, 141, 316,
371     41,  42,  43,  44,  45,  56, 142, 231, 317,  63,
372     73,  92, 340,  82, 324, 149, 353, 159, 334, 165,
373     338, 178, 163, 254,  77, 168, 257, 153, 343,  57,
374     248, 238,  79, 252, 166,  67,  80, 201, 101, 267,
375     143, 164, 341, 255, 339, 187, 376, 318,  78, 328,
376     362, 115, 232, 242, 253, 290, 276,  62,  58, 158,
377     68,  93, 179, 319, 148, 169, 154,  72, 385, 329,
378     333, 344, 102,  83, 144, 233, 323, 124, 243, 192,
379     354, 237,  64, 247, 202, 209, 150, 116, 335, 268,
380     239, 299, 188, 196, 298,  94, 195, 258, 123, 363,
381     384, 109, 325, 371, 170, 370,  84, 110, 295, 180,
382     74, 210, 191, 106, 291, 205, 367, 381, 377, 206,
383     355, 122, 119, 120, 383, 160, 105, 108, 277, 380,
384     294, 284, 285, 345, 208, 269, 249, 366, 386, 300,
385     297, 259, 125, 369, 197,  97, 194, 286, 211, 281,
386     280, 183, 372,  87, 155, 283,  59, 348, 327, 184,
387     76, 111, 330, 203, 349,  69,  98, 152, 145, 189,
388     66, 320, 337, 173, 358, 251, 198, 174, 263, 262,
389     126, 241, 193,  88, 388, 117,  95, 387, 112, 359,
390     287, 244, 103, 272, 301, 171, 162, 234, 273, 127,
391     373, 181, 292,  85, 378, 302, 121, 107, 364, 346,
392     356, 212, 278, 213,  65, 382, 288, 207, 113, 175,
393     99, 296, 374, 368, 199, 260, 185, 336, 331, 161,
394     270, 264, 250, 240,  75, 350, 151,  60,  89, 321,
395     156, 274, 360, 326,  70, 282, 167, 146, 352,  81,
396     91, 389, 266, 245, 177, 235, 190, 256, 204, 342,
397     128, 118, 303, 104, 379, 182, 114, 375, 200,  96,
398     293, 172, 214, 365, 279,  86, 289, 351, 347, 357,
399     261, 186, 176, 271,  90, 100, 147, 322, 275, 361,
400     71, 332,  61, 265, 157, 246, 236
401 };
402 
403 const int16 sort_2305[461] =
404 {
405     0,   4,   6, 145, 247, 352, 454,   7,   5,   3,
406     47,  48,  49,  50,  51, 254, 255, 256, 257, 258,
407     146, 248, 353, 455, 151, 253, 358, 460, 148, 250,
408     355, 457, 149, 251, 356, 458, 152, 359, 150, 252,
409     357, 459, 147, 249, 354, 456,  52,   2,   1, 153,
410     360, 259,  19,  21,  12,  17,  18,  20,  16,  25,
411     13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
412     260,  31, 154, 361,   9,  33,  11, 155, 362,  54,
413     261,  28,  27, 156, 363,  34,  35,  29,  46,  32,
414     30,  55, 262,  37,  36,  39,  38,  40, 157, 364,
415     41,  42,  43,  44,  45,  56, 158, 263, 365, 181,
416     192, 170,  79,  57, 399,  90, 159, 297, 377, 366,
417     275,  68, 183, 388, 286, 194, 299, 92 ,  70, 182,
418     401, 172,  59,  91,  58, 400, 368, 161,  81, 160,
419     264, 171,  80, 389, 390, 378, 379, 193, 298,  69,
420     266, 265, 367, 277, 288, 276, 287, 184,  60, 195,
421     82,  93,  71, 369, 402, 173, 162, 444, 300, 391,
422     98,  76, 278,  61, 267, 374, 135, 411, 167, 102,
423     380, 200,  87, 178,  65,  94, 204, 124,  72, 342,
424     189, 305, 381, 396, 433, 301, 226, 407, 289, 237,
425     113, 215, 185, 128, 309, 403, 116, 320, 196, 331,
426     370, 422, 174,  64, 392,  83, 425, 219, 134, 188,
427     432, 112, 427, 139, 279, 163, 436, 208, 447, 218,
428     236, 229,  97, 294, 385, 230, 166, 268, 177, 443,
429     225, 426, 101, 272, 138, 127, 290, 117, 347, 199,
430     414,  95, 140, 240, 410, 395, 209, 129, 283, 346,
431     105, 241, 437,  86, 308, 448, 203, 345, 186, 107,
432     220, 415, 334, 319, 106, 313, 118, 123,  73, 207,
433     421, 214, 384, 373, 438,  62, 371, 341,  75, 449,
434     168, 323, 164, 242, 416, 324, 304, 197, 335, 404,
435     271,  63, 191, 325,  96, 169, 231, 280, 312, 187,
436     406,  84, 201, 100,  67, 382, 175, 336, 202, 330,
437     269, 393, 376, 383, 293, 307, 409, 179, 285, 314,
438     302, 372, 398, 190, 180,  89,  99, 103, 232,  78,
439     88,  77, 136, 387, 165, 198, 394, 125, 176, 428,
440     74, 375, 238, 227,  66, 273, 282, 141, 306, 412,
441     114,  85, 130, 348, 119, 291, 296, 386, 233, 397,
442     303, 405, 284, 445, 423, 221, 210, 205, 450, 108,
443     274, 434, 216, 343, 337, 142, 243, 321, 408, 451,
444     310, 292, 120, 109, 281, 439, 270, 429, 332, 295,
445     418, 211, 315, 222, 326, 131, 430, 244, 327, 349,
446     417, 316, 143, 338, 440, 234, 110, 212, 452, 245,
447     121, 419, 350, 223, 132, 441, 328, 413, 317, 339,
448     126, 104, 137, 446, 344, 239, 435, 115, 333, 206,
449     322, 217, 228, 424, 453, 311, 351, 111, 442, 224,
450     213, 122, 431, 340, 235, 246, 133, 144, 420, 329,
451     318
452 };
453 
454 const int16 sort_2385[477] =
455 {
456     0,   4,   6, 145, 251, 360, 466,   7,   5,   3,
457     47,  48,  49,  50,  51, 262, 263, 264, 265, 266,
458     146, 252, 361, 467, 151, 257, 366, 472, 148, 254,
459     363, 469, 149, 255, 364, 470, 156, 371, 150, 256,
460     365, 471, 147, 253, 362, 468,  52,   2,   1, 157,
461     372, 267,  19,  21,  12,  17,  18,  20,  16,  25,
462     13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
463     268,  31, 152, 153, 154, 155, 258, 259, 260, 261,
464     367, 368, 369, 370, 473, 474, 475, 476, 158, 373,
465     9,  33,  11, 159, 374,  54, 269,  28,  27, 160,
466     375,  34,  35,  29,  46,  32,  30,  55, 270, 37,
467     36,  39,  38,  40, 161, 376,  41,  42,  43,  44,
468     45,  56, 162, 271, 377, 185, 196, 174,  79,  57,
469     411,  90, 163, 305, 389, 378, 283,  68, 187, 400,
470     294, 198, 307,  92,  70, 186, 413, 176,  59,  91,
471     58, 412, 380, 165,  81, 164, 272, 175,  80, 401,
472     402, 390, 391, 197, 306,  69, 274, 273, 379, 285,
473     296, 284, 295, 188,  60, 199,  82,  93,  71, 381,
474     414, 177, 166, 456, 308, 403,  98,  76, 286,  61,
475     275, 386, 135, 423, 171, 102, 392, 204,  87, 182,
476     65,  94, 208, 124,  72, 350, 193, 313, 393, 408,
477     445, 309, 230, 419, 297, 241, 113, 219, 189, 128,
478     317, 415, 116, 328, 200, 339, 382, 434, 178,  64,
479     404,  83, 437, 223, 134, 192, 444, 112, 439, 139,
480     287, 167, 448, 212, 459, 222, 240, 233,  97, 302,
481     397, 234, 170, 276, 181, 455, 229, 438, 101, 280,
482     138, 127, 298, 117, 355, 203, 426,  95, 140, 244,
483     422, 407, 213, 129, 291, 354, 105, 245, 449,  86,
484     316, 460, 207, 353, 190, 107, 224, 427, 342, 327,
485     106, 321, 118, 123,  73, 211, 433, 218, 396, 385,
486     450,  62, 383, 349,  75, 461, 172, 331, 168, 246,
487     428, 332, 312, 201, 343, 416, 279,  63, 195, 333,
488     96, 173, 235, 288, 320, 191, 418,  84, 205, 100,
489     67, 394, 179, 344, 206, 338, 277, 405, 388, 395,
490     301, 315, 421, 183, 293, 322, 310, 384, 410, 194,
491     184,  89,  99, 103, 236,  78,  88,  77, 136, 399,
492     169, 202, 406, 125, 180, 440,  74, 387, 242, 231,
493     66, 281, 290, 141, 314, 424, 114,  85, 130, 356,
494     119, 299, 304, 398, 237, 409, 311, 417, 292, 457,
495     435, 225, 214, 209, 462, 108, 282, 446, 220, 351,
496     345, 142, 247, 329, 420, 463, 318, 300, 120, 109,
497     289, 451, 278, 441, 340, 303, 430, 215, 323, 226,
498     334, 131, 442, 248, 335, 357, 429, 324, 143, 346,
499     452, 238, 110, 216, 464, 249, 121, 431, 358, 227,
500     132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
501     352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
502     465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
503     239, 250, 133, 144, 432, 337, 326
504 };
505 
506 const int16 sort_SID[35] =
507 {
508     0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
509     10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
510     20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
511     30, 31, 32, 33, 34
512 };
513 
514 
515 /*----------------------------------------------------------------------------
516 ; EXTERNAL FUNCTION REFERENCES
517 ; Declare functions defined elsewhere and referenced in this module
518 ----------------------------------------------------------------------------*/
519 
520 /*----------------------------------------------------------------------------
521 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
522 ; Declare variables used in this module but defined elsewhere
523 ----------------------------------------------------------------------------*/
524 
525 /*----------------------------------------------------------------------------
526 ; FUNCTION CODE
527 ----------------------------------------------------------------------------*/
528 
mime_unsorting(uint8 unsorted_bits[],int16 sorted_bits_into_int16[],int16 * frame_type,int16 * mode,uint8 quality,RX_State_wb * st)529 void mime_unsorting(uint8 unsorted_bits[],
530                     int16 sorted_bits_into_int16[],
531                     int16 * frame_type,
532                     int16 * mode,
533                     uint8 quality,
534                     RX_State_wb *st)
535 {
536 
537     int16 i;
538     int16 j;
539     uint8 temp = 0;
540     uint8 *unsorted_bits_ptr = (uint8*)unsorted_bits;
541 
542     /* pointer table for bit sorting tables */
543     const int16 *AmrWbSortingTables[16] =
544     {
545         sort_660,   sort_885, sort_1265, sort_1425,
546         sort_1585,  sort_1825, sort_1985, sort_2305,
547         sort_2385,   sort_SID,      NULL,      NULL,
548         NULL,       NULL,      NULL,      NULL
549     };
550 
551     const int16 * pt_AmrWbSortingTables  = AmrWbSortingTables[*mode];
552 
553     /* clear compressed speech bit buffer */
554     pv_memset(sorted_bits_into_int16,
555               0,
556               unpacked_size[*mode]*sizeof(*sorted_bits_into_int16));
557 
558     /* unpack and unsort speech or SID bits */
559 
560 
561     for (i = unpacked_size[*mode] >> 3; i != 0; i--)
562     {
563         temp = *(unsorted_bits_ptr++);
564 
565         for (j = 2; j != 0; j--)
566         {
567             switch (temp & 0xf0)
568             {
569                 case 0xf0:
570                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
571                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
572                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
573                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
574                     break;
575                 case 0xe0:
576                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
577                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
578                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
579                     pt_AmrWbSortingTables++;
580                     break;
581                 case 0xd0:
582                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
583                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
584                     pt_AmrWbSortingTables++;
585                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
586                     break;
587                 case 0xc0:
588                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
589                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
590                     pt_AmrWbSortingTables += 2;
591                     break;
592                 case 0xb0:
593                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
594                     pt_AmrWbSortingTables++;
595                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
596                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
597                     break;
598                 case 0xa0:
599                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
600                     pt_AmrWbSortingTables++;
601                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
602                     pt_AmrWbSortingTables++;
603                     break;
604                 case 0x90:
605                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
606                     pt_AmrWbSortingTables += 2;
607                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
608                     break;
609                 case 0x80:
610                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
611                     pt_AmrWbSortingTables += 3;
612                     break;
613                 case 0x70:
614                     pt_AmrWbSortingTables++;
615                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
616                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
617                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
618                     break;
619                 case 0x60:
620                     pt_AmrWbSortingTables++;
621                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
622                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
623                     pt_AmrWbSortingTables++;
624                     break;
625                 case 0x50:
626                     pt_AmrWbSortingTables++;
627                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
628                     pt_AmrWbSortingTables++;
629                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
630                     break;
631                 case 0x40:
632                     pt_AmrWbSortingTables++;
633                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
634                     pt_AmrWbSortingTables += 2;
635                     break;
636                 case 0x30:
637                     pt_AmrWbSortingTables += 2;
638                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
639                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
640                     break;
641                 case 0x20:
642                     pt_AmrWbSortingTables += 2;
643                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
644                     pt_AmrWbSortingTables++;
645                     break;
646                 case 0x10:
647                     pt_AmrWbSortingTables += 3;
648                     sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
649                     break;
650                 default:
651                     pt_AmrWbSortingTables += 4;
652                     break;
653             }
654             temp <<= 4;
655         }
656     }
657 
658     if (unpacked_size[*mode] % 4)
659     {
660         temp <<= 1;
661 
662         if (temp & 0x80)
663         {
664             sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
665         }
666     }
667 
668     /* set frame type */
669     switch (*mode)
670     {
671         case MODE_7k:
672         case MODE_9k:
673         case MODE_12k:
674         case MODE_14k:
675         case MODE_16k:
676         case MODE_18k:
677         case MODE_20k:
678         case MODE_23k:
679         case MODE_24k:
680             if (quality)
681             {
682                 *frame_type = RX_SPEECH_GOOD;
683             }
684             else
685             {
686                 *frame_type = RX_SPEECH_BAD;
687             }
688             break;
689 
690         case MRSID:
691             if (quality)
692             {
693                 if (temp & 0x80)
694                 {
695                     *frame_type = RX_SID_UPDATE;
696                 }
697                 else
698                 {
699                     *frame_type = RX_SID_FIRST;
700                 }
701             }
702             else
703             {
704                 *frame_type = RX_SID_BAD;
705             }
706 
707             /* set mode index */
708             *mode = st->prev_mode;
709             break;
710         case 14:        /* SPEECH_LOST */
711             *frame_type = RX_SPEECH_LOST;
712             *mode = st->prev_mode;
713             break;
714         case 15:        /* NO_DATA */
715             *frame_type = RX_NO_DATA;
716             *mode = st->prev_mode;
717             break;
718         default:        /* replace frame with unused mode index by NO_DATA frame */
719             *frame_type = RX_NO_DATA;
720             *mode = st->prev_mode;
721             break;
722     }
723 
724     st->prev_mode = *mode;
725 
726 }
727 
728 
729 
730