Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/dll/amp/misc2.c
1074 views
1
/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
2
*/
3
4
/* misc2.c requantization, stereo processing, reordering(shortbl) and antialiasing butterflies
5
*
6
* misc.c was created by tomislav uzelac in May 1996, and was completely awful
7
* Created by: tomislav uzelac Dec 22 1996
8
* some more speed injected, cca. Jun 1 1997
9
*/
10
#include <math.h>
11
12
#include "amp.h"
13
#include "audio.h"
14
#include "getdata.h"
15
#include "huffman.h"
16
17
#define MISC2
18
#include "misc2.h"
19
20
int no_of_imdcts[2];
21
22
static const int t_pretab[22]={0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
23
static const float t_is[7]={ 1.0, 0.788675134596, 0.633974596215,
24
0.5, 0.366025403784, 0.211324865405, 0.0};
25
static const float t_is2[2][32]={
26
{ 1, 0.840896, 0.707107, 0.594604, 0.5, 0.420448,
27
0.353553, 0.297302, 0.25, 0.210224, 0.176777, 0.148651,
28
0.125, 0.105112, 0.0883883, 0.0743254},
29
{ 1, 0.707107, 0.5, 0.353553, 0.25, 0.176777,
30
0.125, 0.0883883, 0.0625, 0.0441942, 0.03125, 0.0220971,
31
0.015625, 0.0110485, 0.0078125, 0.00552427}
32
};
33
34
static const float t_downmix[2][32]={
35
{ 1.000000, 0.920448, 0.853554, 0.797302, 0.750000, 0.710224,
36
0.676776, 0.648651, 0.625000, 0.605112, 0.588389, 0.574326,
37
0.562500, 0.552556, 0.544194, 0.537163},
38
{ 1.000000, 0.853554, 0.750000, 0.676776, 0.625000, 0.588389,
39
0.562500, 0.544194, 0.531250, 0.522097, 0.515625, 0.511049,
40
0.507813, 0.505524, 0.503906, 0.502762}
41
};
42
43
static const float Cs[8]={0.857492925712, 0.881741997318, 0.949628649103,
44
0.983314592492, 0.995517816065, 0.999160558175,
45
0.999899195243, 0.999993155067};
46
static const float Ca[8]={-0.5144957554270, -0.4717319685650, -0.3133774542040,
47
-0.1819131996110, -0.0945741925262, -0.0409655828852,
48
-0.0141985685725, -0.00369997467375};
49
static const float tab[4]={1,1.189207115,1.414213562,1.6817928301};
50
static const float tabi[4]={1,0.840896415,0.707106781,0.594603557};
51
52
static float t_43[8192];
53
54
55
/* leftmost index denotes header->ID, so first three are for MPEG2
56
* and the others are for MPEG1
57
*/
58
static const short t_reorder[2][3][576]={{
59
{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
60
16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
61
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
62
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 90, 91,
63
78, 79, 80, 81, 82, 83, 96, 97, 84, 85, 86, 87, 88, 89, 102, 103, 92, 93, 94, 95,
64
108, 109, 110, 111, 112, 113, 98, 99, 100, 101, 114, 115, 116, 117, 118, 119, 104, 105, 106, 107,
65
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 148, 149, 162, 163,
66
132, 133, 134, 135, 136, 137, 150, 151, 152, 153, 154, 155, 168, 169, 138, 139, 140, 141, 142, 143,
67
156, 157, 158, 159, 160, 161, 174, 175, 164, 165, 166, 167, 180, 181, 182, 183, 184, 185, 198, 199,
68
200, 201, 202, 203, 216, 217, 170, 171, 172, 173, 186, 187, 188, 189, 190, 191, 204, 205, 206, 207,
69
208, 209, 222, 223, 176, 177, 178, 179, 192, 193, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215,
70
228, 229, 218, 219, 220, 221, 234, 235, 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271,
71
272, 273, 274, 275, 288, 289, 290, 291, 224, 225, 226, 227, 240, 241, 242, 243, 244, 245, 258, 259,
72
260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295, 296, 297, 230, 231, 232, 233, 246, 247,
73
248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303,
74
292, 293, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347,
75
360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383, 298, 299, 312, 313, 314, 315, 316, 317,
76
330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353, 366, 367, 368, 369, 370, 371, 384, 385,
77
386, 387, 388, 389, 304, 305, 318, 319, 320, 321, 322, 323, 336, 337, 338, 339, 340, 341, 354, 355,
78
356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399,
79
400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435, 436, 437, 450, 451, 452, 453, 454, 455,
80
468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491, 504, 505, 506, 507, 508, 509, 402, 403,
81
404, 405, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459,
82
460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515,
83
408, 409, 410, 411, 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463,
84
464, 465, 466, 467, 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519,
85
520, 521, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563,
86
528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 534, 535,
87
536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
88
89
{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
90
16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
91
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
92
72, 73, 60, 61, 62, 63, 64, 65, 78, 79, 66, 67, 68, 69, 70, 71, 84, 85, 74, 75,
93
76, 77, 90, 91, 92, 93, 94, 95, 80, 81, 82, 83, 96, 97, 98, 99, 100, 101, 86, 87,
94
88, 89, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 126, 127, 128, 129, 130, 131,
95
114, 115, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 120, 121, 122, 123, 124, 125, 138, 139,
96
140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167, 180, 181, 150, 151,
97
152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 156, 157, 158, 159, 160, 161, 174, 175,
98
176, 177, 178, 179, 192, 193, 182, 183, 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219,
99
220, 221, 234, 235, 188, 189, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227,
100
240, 241, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
101
236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
102
292, 293, 306, 307, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281,
103
294, 295, 296, 297, 298, 299, 312, 313, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
104
284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
105
328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
106
396, 397, 398, 399, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353,
107
366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 320, 321, 322, 323,
108
336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391,
109
392, 393, 394, 395, 408, 409, 410, 411, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
110
436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
111
504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 406, 407, 420, 421, 422, 423, 424, 425,
112
438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493,
113
494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 412, 413, 426, 427,
114
428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467, 480, 481, 482, 483,
115
484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535, 536, 537, 538, 539,
116
540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563, 546, 547, 548, 549, 550, 551, 564, 565,
117
566, 567, 568, 569, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
118
119
{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
120
16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
121
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
122
72, 73, 60, 61, 62, 63, 64, 65, 78, 79, 66, 67, 68, 69, 70, 71, 84, 85, 74, 75,
123
76, 77, 90, 91, 92, 93, 94, 95, 80, 81, 82, 83, 96, 97, 98, 99, 100, 101, 86, 87,
124
88, 89, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 126, 127, 128, 129, 130, 131,
125
114, 115, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 120, 121, 122, 123, 124, 125, 138, 139,
126
140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167, 180, 181, 150, 151,
127
152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 156, 157, 158, 159, 160, 161, 174, 175,
128
176, 177, 178, 179, 192, 193, 182, 183, 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219,
129
220, 221, 234, 235, 188, 189, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227,
130
240, 241, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
131
236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
132
292, 293, 306, 307, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281,
133
294, 295, 296, 297, 298, 299, 312, 313, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
134
284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
135
328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
136
396, 397, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353, 366, 367,
137
368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 320, 321, 322, 323, 336, 337, 338, 339,
138
340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391, 392, 393, 394, 395,
139
408, 409, 398, 399, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435, 436, 437, 450, 451,
140
452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491, 504, 505, 506, 507,
141
508, 509, 404, 405, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457,
142
458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513,
143
514, 515, 410, 411, 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463,
144
464, 465, 466, 467, 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519,
145
520, 521, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563,
146
528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 534, 535,
147
536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575}
148
},
149
{
150
{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
151
16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
152
42, 43, 44, 45, 48, 49, 50, 51, 40, 41, 54, 55, 56, 57, 46, 47, 60, 61, 62, 63,
153
52, 53, 66, 67, 68, 69, 58, 59, 72, 73, 74, 75, 76, 77, 64, 65, 78, 79, 80, 81,
154
82, 83, 70, 71, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 108, 109, 110, 111,
155
96, 97, 98, 99, 100, 101, 114, 115, 116, 117, 102, 103, 104, 105, 106, 107, 120, 121, 122, 123,
156
112, 113, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 118, 119, 132, 133, 134, 135, 136, 137,
157
150, 151, 152, 153, 124, 125, 138, 139, 140, 141, 142, 143, 156, 157, 158, 159, 148, 149, 162, 163,
158
164, 165, 166, 167, 180, 181, 182, 183, 184, 185, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187,
159
188, 189, 190, 191, 160, 161, 174, 175, 176, 177, 178, 179, 192, 193, 194, 195, 196, 197, 198, 199,
160
200, 201, 202, 203, 216, 217, 218, 219, 220, 221, 234, 235, 236, 237, 238, 239, 204, 205, 206, 207,
161
208, 209, 222, 223, 224, 225, 226, 227, 240, 241, 242, 243, 244, 245, 210, 211, 212, 213, 214, 215,
162
228, 229, 230, 231, 232, 233, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 270, 271,
163
272, 273, 274, 275, 288, 289, 290, 291, 292, 293, 306, 307, 308, 309, 258, 259, 260, 261, 262, 263,
164
276, 277, 278, 279, 280, 281, 294, 295, 296, 297, 298, 299, 312, 313, 314, 315, 264, 265, 266, 267,
165
268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 320, 321, 310, 311,
166
324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379,
167
380, 381, 382, 383, 396, 397, 398, 399, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351,
168
352, 353, 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 322, 323,
169
336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391,
170
392, 393, 394, 395, 408, 409, 410, 411, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
171
436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
172
504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559,
173
560, 561, 562, 563, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457,
174
458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513,
175
514, 515, 528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569,
176
412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467,
177
480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535,
178
536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
179
180
{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
181
16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
182
42, 43, 44, 45, 48, 49, 50, 51, 40, 41, 54, 55, 56, 57, 46, 47, 60, 61, 62, 63,
183
52, 53, 66, 67, 68, 69, 58, 59, 72, 73, 74, 75, 64, 65, 78, 79, 80, 81, 70, 71,
184
84, 85, 86, 87, 76, 77, 90, 91, 92, 93, 94, 95, 108, 109, 82, 83, 96, 97, 98, 99,
185
100, 101, 114, 115, 88, 89, 102, 103, 104, 105, 106, 107, 120, 121, 110, 111, 112, 113, 126, 127,
186
128, 129, 130, 131, 144, 145, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 150, 151, 122, 123,
187
124, 125, 138, 139, 140, 141, 142, 143, 156, 157, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167,
188
180, 181, 182, 183, 152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 188, 189, 158, 159,
189
160, 161, 174, 175, 176, 177, 178, 179, 192, 193, 194, 195, 184, 185, 198, 199, 200, 201, 202, 203,
190
216, 217, 218, 219, 220, 221, 234, 235, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225,
191
226, 227, 240, 241, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
192
236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
193
242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295, 296, 297,
194
248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303,
195
292, 293, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347,
196
360, 361, 362, 363, 364, 365, 298, 299, 312, 313, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335,
197
348, 349, 350, 351, 352, 353, 366, 367, 368, 369, 370, 371, 304, 305, 318, 319, 320, 321, 322, 323,
198
336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 378, 379,
199
380, 381, 382, 383, 396, 397, 398, 399, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
200
436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
201
504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559,
202
560, 561, 562, 563, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 406, 407, 420, 421, 422, 423,
203
424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479,
204
492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 546, 547,
205
548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 390, 391, 392, 393, 394, 395, 408, 409, 410, 411,
206
412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467,
207
480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535,
208
536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
209
210
{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
211
16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
212
42, 43, 44, 45, 48, 49, 50, 51, 40, 41, 54, 55, 56, 57, 46, 47, 60, 61, 62, 63,
213
52, 53, 66, 67, 68, 69, 58, 59, 72, 73, 74, 75, 76, 77, 64, 65, 78, 79, 80, 81,
214
82, 83, 70, 71, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 108, 109, 110, 111,
215
112, 113, 96, 97, 98, 99, 100, 101, 114, 115, 116, 117, 118, 119, 102, 103, 104, 105, 106, 107,
216
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 148, 149, 162, 163,
217
164, 165, 132, 133, 134, 135, 136, 137, 150, 151, 152, 153, 154, 155, 168, 169, 170, 171, 138, 139,
218
140, 141, 142, 143, 156, 157, 158, 159, 160, 161, 174, 175, 176, 177, 166, 167, 180, 181, 182, 183,
219
184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219, 220, 221, 172, 173, 186, 187, 188, 189,
220
190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227, 178, 179, 192, 193, 194, 195,
221
196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
222
252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291, 292, 293, 306, 307,
223
240, 241, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295,
224
296, 297, 298, 299, 312, 313, 246, 247, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
225
284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
226
328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
227
396, 397, 398, 399, 400, 401, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351,
228
352, 353, 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 406, 407,
229
320, 321, 322, 323, 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375,
230
376, 377, 390, 391, 392, 393, 394, 395, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419,
231
432, 433, 434, 435, 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487,
232
488, 489, 490, 491, 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 420, 421, 422, 423,
233
424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479,
234
492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 426, 427,
235
428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467, 480, 481, 482, 483,
236
484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535, 536, 537, 538, 539,
237
540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563, 546, 547, 548, 549, 550, 551, 564, 565,
238
566, 567, 568, 569, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575}
239
}};
240
241
/*
242
* fras == Formula for Requantization and All Scaling **************************
243
*/
244
static inline float fras_l(int sfb,int global_gain,int scalefac_scale,int scalefac,int preflag)
245
{
246
register int a,scale;
247
/*
248
if (scalefac_scale) scale=2;
249
else scale=1;
250
*/
251
scale=scalefac_scale+1;
252
a= global_gain -210 -(scalefac << scale);
253
if (preflag) a-=(t_pretab[sfb] << scale);
254
255
/* bugfix, Mar 13 97: shifting won't produce a legal result if we shift by more than 31
256
* since global_gain<256, this can only occur for (very) negative values of a.
257
*/
258
if (a < -127) return 0;
259
260
/* a minor change here as well, no point in abs() if we now that a<0
261
*/
262
if (a>=0) return tab[a&3]*(1 << (a>>2));
263
else return tabi[(-a)&3]/(1 << ((-a) >> 2));
264
}
265
266
static inline float fras_s(int global_gain,int subblock_gain,int scalefac_scale,int scalefac)
267
{
268
int a;
269
a=global_gain - 210 - (subblock_gain << 3);
270
if (scalefac_scale) a-= (scalefac << 2);
271
else a-= (scalefac << 1);
272
273
if (a < -127) return 0;
274
275
if (a>=0) return tab[a&3]*(1 << (a>>2));
276
else return tabi[(-a)&3]/(1 << ((-a) >> 2));
277
}
278
279
/* this should be faster than pow()
280
*/
281
static inline float fras2(int is,float a)
282
{
283
if (is > 0) return t_43[is]*a;
284
else return -t_43[-is]*a;
285
}
286
287
/*
288
* requantize_mono *************************************************************
289
*/
290
291
/* generally, the two channels do not have to be of the same block type - that's why we do two passes with requantize_mono.
292
* if ms or intensity stereo is enabled we do a single pass with requantize_ms because both channels are same block type
293
*/
294
295
void requantize_mono(int gr,int ch,struct SIDE_INFO *info,struct AUDIO_HEADER *header)
296
{
297
int l,i,sfb;
298
float a;
299
int global_gain=info->global_gain[gr][ch];
300
int scalefac_scale=info->scalefac_scale[gr][ch];
301
int sfreq=header->sampling_frequency;
302
303
304
no_of_imdcts[0]=no_of_imdcts[1]=32;
305
306
if (info->window_switching_flag[gr][ch] && info->block_type[gr][ch]==2)
307
if (info->mixed_block_flag[gr][ch]) {
308
/*
309
* requantize_mono - mixed blocks/long block part **********************
310
*/
311
int window,window_len,preflag=0; /* pretab is all zero in this low frequency area */
312
int scalefac=scalefac_l[gr][ch][0];
313
314
l=0;sfb=0;
315
a=fras_l(sfb,global_gain,scalefac_scale,scalefac,preflag);
316
while (l<36) {
317
xr[ch][0][l]=fras2(is[ch][l],a);
318
if (l==t_l[sfb]) {
319
scalefac=scalefac_l[gr][ch][++sfb];
320
a=fras_l(sfb,global_gain,scalefac_scale,scalefac,preflag);
321
}
322
l++;
323
}
324
/*
325
* requantize_mono - mixed blocks/short block part *********************
326
*/
327
sfb=3;
328
window_len=t_s[sfb]-t_s[sfb-1];
329
while (l<non_zero[ch]) {
330
for (window=0;window<3;window++) {
331
int scalefac=scalefac_s[gr][ch][sfb][window];
332
int subblock_gain=info->subblock_gain[gr][ch][window];
333
a=fras_s(global_gain,subblock_gain,scalefac_scale,scalefac);
334
for (i=0;i<window_len;i++) {
335
xr[ch][0][t_reorder[header->ID][sfreq][l]]=fras2(is[ch][l],a);
336
l++;
337
}
338
}
339
sfb++;
340
window_len=t_s[sfb]-t_s[sfb-1];
341
}
342
while (l<576) xr[ch][0][t_reorder[header->ID][sfreq][l++]]=0;
343
} else {
344
/*
345
* requantize mono - short blocks **************************************
346
*/
347
int window,window_len;
348
349
sfb=0; l=0;
350
window_len=t_s[0]+1;
351
while (l<non_zero[ch]) {
352
for (window=0;window<3;window++) {
353
int scalefac=scalefac_s[gr][ch][sfb][window];
354
int subblock_gain=info->subblock_gain[gr][ch][window];
355
float a=fras_s(global_gain,subblock_gain,scalefac_scale,scalefac);
356
for (i=0;i<window_len;i++) {
357
xr[ch][0][t_reorder[header->ID][sfreq][l]]=fras2(is[ch][l],a);
358
l++;
359
}
360
}
361
sfb++;
362
window_len=t_s[sfb]-t_s[sfb-1];
363
}
364
while (l<576) xr[ch][0][t_reorder[header->ID][sfreq][l++]]=0;
365
}
366
else {
367
/* long blocks */
368
int preflag=info->preflag[gr][ch];
369
int scalefac=scalefac_l[gr][ch][0];
370
371
sfb=0; l=0;
372
a=fras_l(sfb,global_gain,scalefac_scale,scalefac,preflag);
373
while (l<non_zero[ch]) {
374
xr[ch][0][l]=fras2(is[ch][l],a);
375
if (l==t_l[sfb]) {
376
scalefac=scalefac_l[gr][ch][++sfb];
377
a=fras_l(sfb,global_gain,scalefac_scale,scalefac,preflag);
378
}
379
l++;
380
}
381
while (l<576) xr[ch][0][l++]=0;
382
}
383
}
384
385
/*
386
* stereo stuff ****************************************************************
387
*/
388
static int find_isbound(int isbound[3],int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header)
389
{
390
int sfb,window,window_len,ms_flag,tmp,i;
391
392
isbound[0]=isbound[1]=isbound[2]=-1;
393
no_of_imdcts[0]=no_of_imdcts[1]=32;
394
395
if (header->mode_extension==1 || header->mode_extension==3) {
396
if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2) {
397
398
/* find that isbound!
399
*/
400
tmp=non_zero[1];
401
sfb=0; while ((3*t_s[sfb]+2) < tmp && sfb < 12) sfb++;
402
while ((isbound[0]<0 || isbound[1]<0 || isbound[2]<0) && !(info->mixed_block_flag[gr][0] && sfb<3) && sfb) {
403
for (window=0;window<3;window++) {
404
if (sfb==0) {
405
window_len=t_s[0]+1;
406
tmp=(window+1)*window_len - 1;
407
} else {
408
window_len=t_s[sfb]-t_s[sfb-1];
409
tmp=(3*t_s[sfb-1]+2) + (window+1)*window_len;
410
}
411
if (isbound[window] < 0)
412
for (i=0;i<window_len;i++)
413
if (is[1][tmp--] != 0) {
414
isbound[window]=t_s[sfb]+1;
415
break;
416
}
417
}
418
sfb--;
419
}
420
421
/* mixed block magic now...
422
*/
423
if (sfb==2 && info->mixed_block_flag[gr][0])
424
{
425
if (isbound[0]<0 && isbound[1]<0 && isbound[2]<0)
426
{
427
tmp=35;
428
while (is[1][tmp] == 0) tmp--;
429
sfb=0; while (t_l[sfb] < tmp && sfb < 21) sfb++;
430
isbound[0]=isbound[1]=isbound[2]=t_l[sfb]+1;
431
} else for (window=0;window<3;window++)
432
if (isbound[window]<0) isbound[window]=36;
433
}
434
if (header->ID==1) isbound[0]=isbound[1]=isbound[2]=MAX(isbound[0],MAX(isbound[1],isbound[2]));
435
436
/* just how many imdcts?
437
*/
438
tmp=non_zero[0];
439
sfb=0; while ((3*t_s[sfb]+2) < tmp && sfb < 12) sfb++;
440
no_of_imdcts[0]=no_of_imdcts[1]=(t_s[sfb]-1)/6+1;
441
} else {
442
443
/* long blocks now
444
*/
445
tmp=non_zero[1];
446
while (is[1][tmp] == 0) tmp--;
447
sfb=0; while (t_l[sfb] < tmp && sfb < 21) sfb++;
448
isbound[0]=isbound[1]=isbound[2]=t_l[sfb]+1;
449
no_of_imdcts[0]=no_of_imdcts[1]=(non_zero[0]-1)/18+1;
450
}
451
if (header->mode_extension==1) ms_flag=0;
452
else ms_flag=1;
453
} else {
454
455
/* intensity stereo is, regretably, turned off
456
*/
457
ms_flag=1;
458
459
/* i really put a lot of work in this, but it still looks like shit (works, though)
460
*/
461
if (!info->window_switching_flag[gr][0] || (info->window_switching_flag[gr][0] && info->block_type[gr][0]!=2))
462
isbound[0]=isbound[1]=isbound[2]=(MAX(non_zero[0],non_zero[1]));
463
else isbound[0]=isbound[1]=isbound[2]=576;
464
465
if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2) {
466
/* should do for mixed blocks too, though i havent tested... */
467
tmp=(MAX(non_zero[0],non_zero[1]))/3;
468
sfb=0; while (t_s[sfb]<tmp && sfb<12) sfb++;
469
no_of_imdcts[0]=no_of_imdcts[1]=(t_s[sfb]-1)/6+1;
470
}
471
else no_of_imdcts[0]=no_of_imdcts[1]=(isbound[0]-1)/18+1;
472
473
}
474
475
return ms_flag;
476
}
477
478
static inline void stereo_s(int l,float a[2],int pos,int ms_flag,int is_pos,struct AUDIO_HEADER *header)
479
{
480
float ftmp,Mi,Si;
481
482
if (l>=576) return; /* brrr... */
483
484
if ((is_pos != IS_ILLEGAL) && (header->ID==1)) {
485
ftmp=fras2(is[0][l],a[0]);
486
xr[0][0][pos]=(1-t_is[is_pos])*ftmp;
487
xr[1][0][pos]=t_is[is_pos]*ftmp;
488
return;
489
}
490
491
if ((is_pos != IS_ILLEGAL) && (header->ID==0)) {
492
ftmp=fras2(is[0][l],a[0]);
493
if (is_pos&1) {
494
xr[0][0][pos]= t_is2[intensity_scale][(is_pos+1)>>1] * ftmp;
495
xr[1][0][pos]= ftmp;
496
} else {
497
xr[0][0][pos]= ftmp;
498
xr[1][0][pos]= t_is2[intensity_scale][is_pos>>1] * ftmp;
499
}
500
return;
501
}
502
503
if (ms_flag) {
504
Mi=fras2(is[0][l],a[0]);
505
Si=fras2(is[1][l],a[1]);
506
xr[0][0][pos]=(Mi+Si)*i_sq2;
507
xr[1][0][pos]=(Mi-Si)*i_sq2;
508
} else {
509
xr[0][0][pos]=fras2(is[0][l],a[0]);
510
xr[1][0][pos]=fras2(is[1][l],a[1]);
511
}
512
}
513
514
static inline void stereo_l(int l,float a[2],int ms_flag,int is_pos,struct AUDIO_HEADER *header)
515
{
516
float ftmp,Mi,Si;
517
if (l>=576) return;
518
519
/* new code by ???
520
*/
521
if (is_pos != IS_ILLEGAL) {
522
ftmp = fras2(is[0][l], a[0]);
523
if (header -> ID ==1) {
524
xr[0][0][l] = (1 - t_is[is_pos]) * ftmp;
525
xr[1][0][l] = t_is[is_pos] * ftmp;
526
return;
527
} else if (is_pos & 1) {
528
xr[0][0][l] = t_is2[intensity_scale][(is_pos + 1) >> 1] * ftmp;
529
xr[1][0][l] = ftmp;
530
} else {
531
xr[0][0][l] = ftmp;
532
xr[1][0][l] = t_is2[intensity_scale][is_pos >> 1] * ftmp;
533
}
534
return;
535
}
536
537
if (ms_flag) {
538
Mi=fras2(is[0][l],a[0]);
539
Si=fras2(is[1][l],a[1]);
540
xr[0][0][l]=(Mi+Si)*i_sq2;
541
xr[1][0][l]=(Mi-Si)*i_sq2;
542
} else {
543
xr[0][0][l]=fras2(is[0][l],a[0]);
544
xr[1][0][l]=fras2(is[1][l],a[1]);
545
}
546
547
}
548
549
550
/*
551
* requantize_ms ***************************************************************
552
*/
553
void requantize_ms(int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header)
554
{
555
int l,sfb,ms_flag,is_pos,i,ch;
556
int *global_gain,subblock_gain[2],*scalefac_scale,scalefac[2],isbound[3];
557
int sfreq=header->sampling_frequency;
558
int id = header->ID;
559
float a[2];
560
561
global_gain=info->global_gain[gr];
562
scalefac_scale=info->scalefac_scale[gr];
563
564
if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2)
565
{
566
if (info->mixed_block_flag[gr][0])
567
{
568
/*
569
* mixed blocks w/stereo processing - long block part ******************
570
*/
571
int window,window_len;
572
int preflag[2]={0,0};
573
574
ms_flag=find_isbound(isbound,gr,info,header);
575
576
sfb=0; l=0;
577
for (ch=0;ch<2;ch++) {
578
scalefac[ch]=scalefac_l[gr][ch][0];
579
a[ch]=fras_l(0,global_gain[ch],scalefac_scale[ch],scalefac[ch],preflag[ch]);
580
}
581
582
583
while (l<36) {
584
int is_pos;
585
if (l<isbound[0])
586
is_pos=IS_ILLEGAL;
587
else
588
{
589
is_pos=scalefac[1];
590
if (id==1) /* MPEG1 */
591
{
592
if (is_pos==7)
593
is_pos=IS_ILLEGAL;
594
}
595
else /* MPEG2 */
596
{
597
if (is_pos==is_max[sfb])
598
is_pos=IS_ILLEGAL;
599
}
600
}
601
602
stereo_l(l,a,ms_flag,is_pos,header);
603
604
if (l==t_l[sfb])
605
{
606
sfb++;
607
for (ch=0;ch<2;ch++)
608
{
609
scalefac[ch]=scalefac_l[gr][ch][sfb];
610
a[ch]=fras_l(sfb,global_gain[ch],scalefac_scale[ch],scalefac[ch],preflag[ch]);
611
}
612
}
613
614
l++;
615
}
616
/*
617
* mixed blocks w/stereo processing - short block part *****************
618
*/
619
sfb=3;
620
window_len=t_s[sfb]-t_s[sfb-1];
621
622
while (l<(MAX(non_zero[0],non_zero[1])))
623
{
624
for (window=0;window<3;window++)
625
{
626
subblock_gain[0]=info->subblock_gain[gr][0][window];
627
subblock_gain[1]=info->subblock_gain[gr][1][window];
628
scalefac[0]=scalefac_s[gr][0][sfb][window];
629
scalefac[1]=scalefac_s[gr][1][sfb][window];
630
631
if (t_s[sfb] < isbound[window])
632
{
633
is_pos=IS_ILLEGAL;
634
a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
635
a[1]=fras_s(global_gain[1],subblock_gain[1],scalefac_scale[1],scalefac[1]);
636
}
637
else
638
{
639
is_pos=scalefac[1];
640
if (id==1) /* MPEG1 */
641
{
642
if (is_pos==7)
643
is_pos=IS_ILLEGAL;
644
}
645
else /* MPEG2 */
646
{
647
if (is_pos==is_max[sfb+6])
648
is_pos=IS_ILLEGAL;
649
}
650
a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
651
}
652
653
for (i=0;i<window_len;i++)
654
{
655
stereo_s(l,a,t_reorder[id][sfreq][l],ms_flag,is_pos,header);
656
l++;
657
}
658
}
659
sfb++;
660
window_len=t_s[sfb]-t_s[sfb-1];
661
}
662
while (l<576)
663
{
664
int reorder = t_reorder[id][sfreq][l++];
665
666
xr[0][0][reorder]=xr[1][0][reorder]=0;
667
}
668
}
669
else
670
{
671
/*
672
* requantize_ms - short blocks w/stereo processing ********************
673
*/
674
int window,window_len;
675
676
ms_flag=find_isbound(isbound,gr,info,header);
677
sfb=0; l=0;
678
window_len=t_s[0]+1;
679
680
while (l<(MAX(non_zero[0],non_zero[1])))
681
{
682
for (window=0;window<3;window++)
683
{
684
subblock_gain[0]=info->subblock_gain[gr][0][window];
685
subblock_gain[1]=info->subblock_gain[gr][1][window];
686
scalefac[0]=scalefac_s[gr][0][sfb][window];
687
scalefac[1]=scalefac_s[gr][1][sfb][window];
688
689
if (t_s[sfb] < isbound[window])
690
{
691
is_pos=IS_ILLEGAL;
692
a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
693
a[1]=fras_s(global_gain[1],subblock_gain[1],scalefac_scale[1],scalefac[1]);
694
}
695
else
696
{
697
is_pos=scalefac[1];
698
if (id==1) /* MPEG1 */
699
{
700
if (is_pos==7)
701
is_pos=IS_ILLEGAL;
702
}
703
else /* MPEG2 */
704
{
705
if (is_pos==is_max[sfb+6])
706
is_pos=IS_ILLEGAL;
707
}
708
a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
709
}
710
711
for (i=0;i<window_len;i++)
712
{
713
stereo_s(l,a,t_reorder[id][sfreq][l],ms_flag,is_pos,header);
714
l++;
715
}
716
}
717
/* this won't do anymore
718
* window_len=-t_s[sfb]+t_s[++sfb];
719
*/
720
window_len = -t_s[sfb++];
721
window_len += t_s[sfb];
722
723
}
724
while (l<576)
725
{
726
int reorder = t_reorder[id][sfreq][l++];
727
728
xr[0][0][reorder]=xr[1][0][reorder]=0;
729
}
730
}
731
}
732
else
733
{
734
/*
735
* long blocks w/stereo processing *************************************
736
*/
737
int *preflag=info->preflag[gr];
738
739
ms_flag=find_isbound(isbound,gr,info,header);
740
741
sfb=0; l=0;
742
scalefac[0]=scalefac_l[gr][0][sfb];
743
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
744
scalefac[1]=scalefac_l[gr][1][sfb];
745
a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
746
747
/* no intensity stereo part
748
*/
749
if (ms_flag)
750
while (l< isbound[0]) {
751
#if defined(PENTIUM_RDTSC)
752
753
unsigned int cnt4, cnt3, cnt2, cnt1;
754
static int min_cycles = 99999999;
755
756
__asm__(".byte 0x0f,0x31" : "=a" (cnt1), "=d" (cnt4));
757
#endif
758
759
{
760
register float Mi = fras2(is[0][l],a[0]);
761
register float Si = fras2(is[1][l],a[1]);
762
register float tmp = i_sq2;
763
xr[0][0][l]=(Mi+Si)*tmp;
764
xr[1][0][l]=(Mi-Si)*tmp;
765
}
766
767
#if defined(PENTIUM_RDTSC)
768
__asm__(".byte 0x0f,0x31" : "=a" (cnt2), "=d" (cnt4));
769
770
if (cnt2-cnt1 < min_cycles) {
771
min_cycles = cnt2-cnt1;
772
/*printf("%d cycles\n", min_cycles);*/
773
}
774
775
#endif
776
if (l==t_l[sfb]) {
777
#if defined(PENTIUM_RDTSC2)
778
779
unsigned int cnt4, cnt2, cnt1;
780
static int min_cycles = 99999999;
781
782
__asm__(".byte 0x0f,0x31" : "=a" (cnt1), "=d" (cnt4));
783
#endif
784
785
sfb++;
786
scalefac[0]=scalefac_l[gr][0][sfb];
787
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
788
scalefac[1]=scalefac_l[gr][1][sfb];
789
a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
790
#if defined(PENTIUM_RDTSC2)
791
__asm__(".byte 0x0f,0x31" : "=a" (cnt2), "=d" (cnt4));
792
793
if (cnt2-cnt1 < min_cycles) {
794
min_cycles = cnt2-cnt1;
795
/*printf("%d cycles, sfb %d\n", min_cycles, sfb);*/
796
}
797
798
#endif
799
}
800
l++;
801
}
802
else
803
while (l< isbound[0]) {
804
xr[0][0][l]=fras2(is[0][l],a[0]);
805
xr[1][0][l]=fras2(is[1][l],a[1]);
806
if (l==t_l[sfb]) {
807
sfb++;
808
scalefac[0]=scalefac_l[gr][0][sfb];
809
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
810
scalefac[1]=scalefac_l[gr][1][sfb];
811
a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
812
}
813
l++;
814
}
815
816
817
/* intensity stereo part
818
*/
819
while (l<(MAX(non_zero[0],non_zero[1]))) {
820
int is_pos=scalefac[1];
821
822
if (id==1) /* MPEG1 */
823
{
824
if (is_pos==7)
825
is_pos=IS_ILLEGAL;
826
}
827
else /* MPEG2 */
828
{
829
if (is_pos==is_max[sfb])
830
is_pos=IS_ILLEGAL;
831
}
832
stereo_l(l,a,ms_flag,is_pos,header);
833
834
if (l==t_l[sfb])
835
{
836
sfb++;
837
scalefac[0]=scalefac_l[gr][0][sfb];
838
scalefac[1]=scalefac_l[gr][1][sfb];
839
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
840
}
841
l++;
842
}
843
844
while (l<576) {
845
xr[0][0][l]=0;
846
xr[1][0][l]=0;
847
l++;
848
}
849
}
850
}
851
852
/*
853
* requantize_downmix **********************************************************
854
*/
855
void requantize_downmix(int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header)
856
{
857
int l,sfb,ms_flag,i;
858
int *global_gain,subblock_gain[2],*scalefac_scale,scalefac[2];
859
int sfreq=header->sampling_frequency;
860
int id = header->ID;
861
float a[2];
862
863
/* first set some variables
864
*/
865
global_gain=info->global_gain[gr];
866
scalefac_scale=info->scalefac_scale[gr];
867
868
if (header->mode_extension==2 || header->mode_extension==3) ms_flag=1;
869
else ms_flag=0;
870
871
/* ... and then we're off for requantization
872
*/
873
if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2)
874
{
875
if (info->mixed_block_flag[gr][0])
876
{
877
die("mixed block? hmmmm...., downmix for mixed blocks is not yet implemented\n");
878
}
879
else
880
{
881
int window,window_len;
882
int isbound[3];
883
int is_pos;
884
885
find_isbound(isbound,gr,info,header); /* ugly hack, part3 */
886
887
sfb=0; l=0; window_len=t_s[0]+1;
888
889
while (l<(MAX(non_zero[0],non_zero[1])))
890
{
891
for (window=0;window<3;window++)
892
{
893
subblock_gain[0]=info->subblock_gain[gr][0][window];
894
subblock_gain[1]=info->subblock_gain[gr][1][window];
895
scalefac[0]=scalefac_s[gr][0][sfb][window];
896
is_pos=scalefac[1]=scalefac_s[gr][1][sfb][window];
897
898
if (t_s[sfb] < isbound[window])
899
{
900
a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
901
if (ms_flag)
902
{
903
for (i=0;i<window_len;i++)
904
{
905
register float Mi=fras2(is[0][l],a[0]);
906
xr[0][0][t_reorder[id][sfreq][l]]=Mi*i_sq2;
907
l++;
908
}
909
}
910
else
911
{
912
a[1]=fras_s(global_gain[1],subblock_gain[1],scalefac_scale[1],scalefac[1]);
913
for (i=0;i<window_len;i++)
914
{
915
register float tmp1=fras2(is[0][l],a[0]);
916
register float tmp2=fras2(is[1][l],a[1]);
917
xr[0][0][t_reorder[id][sfreq][l]]=(tmp1+tmp2)*0.5f;
918
l++;
919
}
920
}
921
}
922
else
923
{
924
a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
925
for (i=0;i<window_len;i++)
926
{
927
register float ftmp = fras2(is[0][l], a[0]);
928
if (id==0 && is_pos<is_max[sfb])
929
ftmp*=t_downmix[intensity_scale][(is_pos+1)>>1];
930
xr[0][0][t_reorder[id][sfreq][l]] = ftmp;
931
l++;
932
}
933
}
934
}
935
window_len = -t_s[sfb++];
936
window_len += t_s[sfb];
937
}
938
while (l<576)
939
{
940
xr[0][0][l]=0;
941
l++;
942
}
943
}
944
}
945
else
946
{
947
int *preflag=info->preflag[gr];
948
int isbound;
949
950
if (header->mode_extension==1 || header->mode_extension==3)
951
{
952
int tmp=non_zero[1];
953
while (is[1][tmp] == 0) tmp--;
954
sfb=0; while (t_l[sfb] < tmp && sfb < 21) sfb++;
955
isbound=t_l[sfb]+1;
956
no_of_imdcts[0]=no_of_imdcts[1]=(non_zero[0]-1)/18+1;
957
}
958
else
959
{
960
isbound=(MAX(non_zero[0],non_zero[1]));
961
no_of_imdcts[0]=no_of_imdcts[1]=(isbound-1)/18+1;
962
}
963
964
sfb=0; l=0;
965
scalefac[0]=scalefac_l[gr][0][sfb];
966
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
967
scalefac[1]=scalefac_l[gr][1][sfb];
968
a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
969
970
/* no intensity stereo part
971
*/
972
if (ms_flag)
973
{
974
while (l < isbound)
975
{
976
register float Mi = fras2(is[0][l],a[0]);
977
register float tmp = i_sq2;
978
xr[0][0][l]=Mi*tmp;
979
980
if (l==t_l[sfb])
981
{
982
sfb++;
983
scalefac[0]=scalefac_l[gr][0][sfb];
984
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
985
scalefac[1]=scalefac_l[gr][1][sfb];
986
}
987
l++;
988
}
989
}
990
else
991
{
992
while (l < isbound)
993
{
994
register float tmp1=fras2(is[0][l],a[0]);
995
register float tmp2=fras2(is[1][l],a[1]);
996
xr[0][0][l]=(tmp1+tmp2)*0.5f;
997
if (l==t_l[sfb])
998
{
999
sfb++;
1000
scalefac[0]=scalefac_l[gr][0][sfb];
1001
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
1002
scalefac[1]=scalefac_l[gr][1][sfb];
1003
a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
1004
}
1005
l++;
1006
}
1007
}
1008
/* intensity stereo part
1009
*/
1010
while (l<(MAX(non_zero[0],non_zero[1])))
1011
{
1012
int is_pos=scalefac[1];
1013
register float ftmp=fras2(is[0][l], a[0]);
1014
1015
if (id==0 && is_pos<is_max[sfb])
1016
{
1017
ftmp*=t_downmix[intensity_scale][(is_pos+1)>>1];
1018
}
1019
1020
xr[0][0][l] = ftmp;
1021
1022
if (l==t_l[sfb])
1023
{
1024
sfb++;
1025
scalefac[0]=scalefac_l[gr][0][sfb];
1026
a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
1027
scalefac[1]=scalefac_l[gr][1][sfb];
1028
}
1029
l++;
1030
}
1031
1032
/* _always_ zero out everything else
1033
*/
1034
while (l<576)
1035
{
1036
xr[0][0][l]=0;
1037
l++;
1038
}
1039
}
1040
}
1041
1042
/*
1043
* antialiasing butterflies ****************************************************
1044
*
1045
*/
1046
void alias_reduction(int ch)
1047
{
1048
unsigned int sb;
1049
1050
for (sb=1;sb<32;sb++)
1051
{
1052
float *x = xr[ch][sb];
1053
register float a, b;
1054
1055
a = x[0];
1056
b = x[-1];
1057
x[-1] = b * Cs[0] - a * Ca[0];
1058
x[0] = a * Cs[0] + b * Ca[0];
1059
1060
a = x[1];
1061
b = x[-2];
1062
x[-2] = b * Cs[1] - a * Ca[1];
1063
x[1] = a * Cs[1] + b * Ca[1];
1064
1065
a = x[2];
1066
b = x[-3];
1067
x[-3] = b * Cs[2] - a * Ca[2];
1068
x[2] = a * Cs[2] + b * Ca[2];
1069
1070
a = x[3];
1071
b = x[-4];
1072
x[-4] = b * Cs[3] - a * Ca[3];
1073
x[3] = a * Cs[3] + b * Ca[3];
1074
1075
a = x[4];
1076
b = x[-5];
1077
x[-5] = b * Cs[4] - a * Ca[4];
1078
x[4] = a * Cs[4] + b * Ca[4];
1079
1080
a = x[5];
1081
b = x[-6];
1082
x[-6] = b * Cs[5] - a * Ca[5];
1083
x[5] = a * Cs[5] + b * Ca[5];
1084
1085
a = x[6];
1086
b = x[-7];
1087
x[-7] = b * Cs[6] - a * Ca[6];
1088
x[6] = a * Cs[6] + b * Ca[6];
1089
1090
a = x[7];
1091
b = x[-8];
1092
x[-8] = b * Cs[7] - a * Ca[7];
1093
x[7] = a * Cs[7] + b * Ca[7];
1094
}
1095
}
1096
1097
/* calculating t_43 instead of having that big table in misc2.h
1098
*/
1099
1100
void calculate_t43(void)
1101
{
1102
int i;
1103
for (i=0;i<8192;i++)
1104
t_43[i]=(float)pow((float)i,1.33333333333f);
1105
}
1106
1107