Mercurial > libavcodec.hg
annotate mpegaudiodec.c @ 11864:7204cb7dd601 libavcodec
Quant changes only once per MB so move the corresponding scale factor assignment
out of the block decoding loop. Indeo4 doesn't use any scale table but the quant
level itself as scale. Therefore access scale table only if its pointer != NULL.
| author | maxim |
|---|---|
| date | Thu, 10 Jun 2010 17:31:12 +0000 |
| parents | f21bbfe942d4 |
| children | 0e777af9160a |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2 * MPEG Audio decoder | |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8598
diff
changeset
|
3 * Copyright (c) 2001, 2002 Fabrice Bellard |
| 0 | 4 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3938
diff
changeset
|
5 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3938
diff
changeset
|
6 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3938
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
| 429 | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3938
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
| 0 | 11 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3938
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
| 0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 * Lesser General Public License for more details. | |
| 0 | 16 * |
| 429 | 17 * You should have received a copy of the GNU Lesser General Public |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3938
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3023
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 0 | 20 */ |
| 1106 | 21 |
| 22 /** | |
|
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
23 * @file |
| 1106 | 24 * MPEG Audio decoder. |
| 2967 | 25 */ |
| 1106 | 26 |
| 0 | 27 #include "avcodec.h" |
| 9428 | 28 #include "get_bits.h" |
|
1734
8aace334bcf0
lrintf patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
1733
diff
changeset
|
29 #include "dsputil.h" |
| 0 | 30 |
| 31 /* | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
32 * TODO: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
33 * - in low precision mode, use more 16 bit multiplies in synth filter |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
34 * - test lsf / mpeg25 extensively. |
| 0 | 35 */ |
| 36 | |
| 2913 | 37 #include "mpegaudio.h" |
| 5050 | 38 #include "mpegaudiodecheader.h" |
| 2479 | 39 |
| 3752 | 40 #include "mathops.h" |
| 41 | |
| 11707 | 42 #if CONFIG_FLOAT |
|
11723
87851e2b449a
1.0 and the resulting exactly representable value must be marked as float as well,
michael
parents:
11722
diff
changeset
|
43 # define SHR(a,b) ((a)*(1.0f/(1<<(b)))) |
| 11707 | 44 # define compute_antialias compute_antialias_float |
| 45 # define FIXR_OLD(a) ((int)((a) * FRAC_ONE + 0.5)) | |
|
11722
5aa83c5fb2c9
Cast constants to float to avoid gcc converting to and from
michael
parents:
11716
diff
changeset
|
46 # define FIXR(x) ((float)(x)) |
|
5aa83c5fb2c9
Cast constants to float to avoid gcc converting to and from
michael
parents:
11716
diff
changeset
|
47 # define FIXHR(x) ((float)(x)) |
| 11707 | 48 # define MULH3(x, y, s) ((s)*(y)*(x)) |
| 49 # define MULLx(x, y, s) ((y)*(x)) | |
| 50 # define RENAME(a) a ## _float | |
| 51 #else | |
| 52 # define SHR(a,b) ((a)>>(b)) | |
| 53 # define compute_antialias compute_antialias_integer | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
54 /* WARNING: only correct for posititive numbers */ |
| 11707 | 55 # define FIXR_OLD(a) ((int)((a) * FRAC_ONE + 0.5)) |
| 56 # define FIXR(a) ((int)((a) * FRAC_ONE + 0.5)) | |
| 57 # define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5)) | |
| 58 # define MULH3(x, y, s) MULH((s)*(x), y) | |
| 59 # define MULLx(x, y, s) MULL(x,y,s) | |
| 60 # define RENAME(a) a | |
| 61 #endif | |
| 2489 | 62 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
63 /****************/ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
64 |
| 0 | 65 #define HEADER_SIZE 4 |
| 66 | |
|
5031
70f194a2ee53
move some common mpeg audio tables from mpegaudiodectab.h to mpegaudiodata.c
aurel
parents:
5009
diff
changeset
|
67 #include "mpegaudiodata.h" |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
68 #include "mpegaudiodectab.h" |
| 0 | 69 |
|
1733
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
70 static void compute_antialias_integer(MPADecodeContext *s, GranuleDef *g); |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
71 static void compute_antialias_float(MPADecodeContext *s, GranuleDef *g); |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
72 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
73 /* vlc structure for decoding layer 3 huffman tables */ |
| 2967 | 74 static VLC huff_vlc[16]; |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
75 static VLC_TYPE huff_vlc_tables[ |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
76 0+128+128+128+130+128+154+166+ |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
77 142+204+190+170+542+460+662+414 |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
78 ][2]; |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
79 static const int huff_vlc_tables_sizes[16] = { |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
80 0, 128, 128, 128, 130, 128, 154, 166, |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
81 142, 204, 190, 170, 542, 460, 662, 414 |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
82 }; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
83 static VLC huff_quad_vlc[2]; |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
84 static VLC_TYPE huff_quad_vlc_tables[128+16][2]; |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
85 static const int huff_quad_vlc_tables_sizes[2] = { |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
86 128, 16 |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
87 }; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
88 /* computed from band_size_long */ |
| 1064 | 89 static uint16_t band_index_long[9][23]; |
|
10469
23ca6d60184d
Add support for hardcoding the mpegaudiodec tables.
reimar
parents:
10440
diff
changeset
|
90 #include "mpegaudio_tablegen.h" |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
91 /* intensity stereo coef table */ |
| 11707 | 92 static INTFLOAT is_table[2][16]; |
| 93 static INTFLOAT is_table_lsf[2][2][16]; | |
|
1733
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
94 static int32_t csa_table[8][4]; |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
95 static float csa_table_float[8][4]; |
| 11707 | 96 static INTFLOAT mdct_win[8][36]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
97 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
98 /* lower 2 bits: modulo 3, higher bits: shift */ |
| 1064 | 99 static uint16_t scale_factor_modshift[64]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
100 /* [i][j]: 2^(-j/3) * FRAC_ONE * 2^(i+2) / (2^(i+2) - 1) */ |
| 1064 | 101 static int32_t scale_factor_mult[15][3]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
102 /* mult table for layer 2 group quantization */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
103 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
104 #define SCALE_GEN(v) \ |
| 11707 | 105 { FIXR_OLD(1.0 * (v)), FIXR_OLD(0.7937005259 * (v)), FIXR_OLD(0.6299605249 * (v)) } |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
106 |
| 2753 | 107 static const int32_t scale_factor_mult2[3][3] = { |
|
449
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
108 SCALE_GEN(4.0 / 3.0), /* 3 steps */ |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
109 SCALE_GEN(4.0 / 5.0), /* 5 steps */ |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
110 SCALE_GEN(4.0 / 9.0), /* 9 steps */ |
| 0 | 111 }; |
| 112 | |
| 11707 | 113 DECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512]; |
| 2967 | 114 |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
115 /** |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
116 * Convert region offsets to region sizes and truncate |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
117 * size to big_values. |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
118 */ |
| 11374 | 119 static void ff_region_offset2size(GranuleDef *g){ |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
120 int i, k, j=0; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
121 g->region_size[2] = (576 / 2); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
122 for(i=0;i<3;i++) { |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
123 k = FFMIN(g->region_size[i], g->big_values); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
124 g->region_size[i] = k - j; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
125 j = k; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
126 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
127 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
128 |
| 11374 | 129 static void ff_init_short_region(MPADecodeContext *s, GranuleDef *g){ |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
130 if (g->block_type == 2) |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
131 g->region_size[0] = (36 / 2); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
132 else { |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
133 if (s->sample_rate_index <= 2) |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
134 g->region_size[0] = (36 / 2); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
135 else if (s->sample_rate_index != 8) |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
136 g->region_size[0] = (54 / 2); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
137 else |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
138 g->region_size[0] = (108 / 2); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
139 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
140 g->region_size[1] = (576 / 2); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
141 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
142 |
| 11374 | 143 static void ff_init_long_region(MPADecodeContext *s, GranuleDef *g, int ra1, int ra2){ |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
144 int l; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
145 g->region_size[0] = |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
146 band_index_long[s->sample_rate_index][ra1 + 1] >> 1; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
147 /* should not overflow */ |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
148 l = FFMIN(ra1 + ra2 + 2, 22); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
149 g->region_size[1] = |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
150 band_index_long[s->sample_rate_index][l] >> 1; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
151 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
152 |
| 11374 | 153 static void ff_compute_band_indexes(MPADecodeContext *s, GranuleDef *g){ |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
154 if (g->block_type == 2) { |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
155 if (g->switch_point) { |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
156 /* if switched mode, we handle the 36 first samples as |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
157 long blocks. For 8000Hz, we handle the 48 first |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
158 exponents as long blocks (XXX: check this!) */ |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
159 if (s->sample_rate_index <= 2) |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
160 g->long_end = 8; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
161 else if (s->sample_rate_index != 8) |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
162 g->long_end = 6; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
163 else |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
164 g->long_end = 4; /* 8000 Hz */ |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
165 |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
166 g->short_start = 2 + (s->sample_rate_index != 8); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
167 } else { |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
168 g->long_end = 0; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
169 g->short_start = 0; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
170 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
171 } else { |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
172 g->short_start = 13; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
173 g->long_end = 22; |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
174 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
175 } |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
176 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
177 /* layer 1 unscaling */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
178 /* n = number of bits of the mantissa minus 1 */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
179 static inline int l1_unscale(int n, int mant, int scale_factor) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
180 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
181 int shift, mod; |
| 1064 | 182 int64_t val; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
183 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
184 shift = scale_factor_modshift[scale_factor]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
185 mod = shift & 3; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
186 shift >>= 2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
187 val = MUL64(mant + (-1 << n) + 1, scale_factor_mult[n-1][mod]); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
188 shift += n; |
|
449
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
189 /* NOTE: at this point, 1 <= shift >= 21 + 15 */ |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
190 return (int)((val + (1LL << (shift - 1))) >> shift); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
191 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
192 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
193 static inline int l2_unscale_group(int steps, int mant, int scale_factor) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
194 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
195 int shift, mod, val; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
196 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
197 shift = scale_factor_modshift[scale_factor]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
198 mod = shift & 3; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
199 shift >>= 2; |
|
449
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
200 |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
201 val = (mant - (steps >> 1)) * scale_factor_mult2[steps >> 2][mod]; |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
202 /* NOTE: at this point, 0 <= shift <= 21 */ |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
203 if (shift > 0) |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
204 val = (val + (1 << (shift - 1))) >> shift; |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
205 return val; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
206 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
207 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
208 /* compute value^(4/3) * 2^(exponent/4). It normalized to FRAC_BITS */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
209 static inline int l3_unscale(int value, int exponent) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
210 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
211 unsigned int m; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
212 int e; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
213 |
| 2490 | 214 e = table_4_3_exp [4*value + (exponent&3)]; |
| 215 m = table_4_3_value[4*value + (exponent&3)]; | |
| 216 e -= (exponent >> 2); | |
| 217 assert(e>=1); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
218 if (e > 31) |
| 2478 | 219 return 0; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
220 m = (m + (1 << (e-1))) >> e; |
| 2490 | 221 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
222 return m; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
223 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
224 |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
225 /* all integer n^(4/3) computation code */ |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
226 #define DEV_ORDER 13 |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
227 |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
228 #define POW_FRAC_BITS 24 |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
229 #define POW_FRAC_ONE (1 << POW_FRAC_BITS) |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
230 #define POW_FIX(a) ((int)((a) * POW_FRAC_ONE)) |
| 1064 | 231 #define POW_MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> POW_FRAC_BITS) |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
232 |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
233 static int dev_4_3_coefs[DEV_ORDER]; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
234 |
|
2522
e25782262d7d
kill warnings patch by (M?ns Rullg?rd <mru inprovide com>)
michael
parents:
2507
diff
changeset
|
235 #if 0 /* unused */ |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
236 static int pow_mult3[3] = { |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
237 POW_FIX(1.0), |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
238 POW_FIX(1.25992104989487316476), |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
239 POW_FIX(1.58740105196819947474), |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
240 }; |
|
2522
e25782262d7d
kill warnings patch by (M?ns Rullg?rd <mru inprovide com>)
michael
parents:
2507
diff
changeset
|
241 #endif |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
242 |
|
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8718
diff
changeset
|
243 static av_cold void int_pow_init(void) |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
244 { |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
245 int i, a; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
246 |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
247 a = POW_FIX(1.0); |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
248 for(i=0;i<DEV_ORDER;i++) { |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
249 a = POW_MULL(a, POW_FIX(4.0 / 3.0) - i * POW_FIX(1.0)) / (i + 1); |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
250 dev_4_3_coefs[i] = a; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
251 } |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
252 } |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
253 |
|
2522
e25782262d7d
kill warnings patch by (M?ns Rullg?rd <mru inprovide com>)
michael
parents:
2507
diff
changeset
|
254 #if 0 /* unused, remove? */ |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
255 /* return the mantissa and the binary exponent */ |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
256 static int int_pow(int i, int *exp_ptr) |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
257 { |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
258 int e, er, eq, j; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
259 int a, a1; |
| 2967 | 260 |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
261 /* renormalize */ |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
262 a = i; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
263 e = POW_FRAC_BITS; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
264 while (a < (1 << (POW_FRAC_BITS - 1))) { |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
265 a = a << 1; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
266 e--; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
267 } |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
268 a -= (1 << POW_FRAC_BITS); |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
269 a1 = 0; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
270 for(j = DEV_ORDER - 1; j >= 0; j--) |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
271 a1 = POW_MULL(a, dev_4_3_coefs[j] + a1); |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
272 a = (1 << POW_FRAC_BITS) + a1; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
273 /* exponent compute (exact) */ |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
274 e = e * 4; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
275 er = e % 3; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
276 eq = e / 3; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
277 a = POW_MULL(a, pow_mult3[er]); |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
278 while (a >= 2 * POW_FRAC_ONE) { |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
279 a = a >> 1; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
280 eq++; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
281 } |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
282 /* convert to float */ |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
283 while (a < POW_FRAC_ONE) { |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
284 a = a << 1; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
285 eq--; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
286 } |
|
407
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
287 /* now POW_FRAC_ONE <= a < 2 * POW_FRAC_ONE */ |
|
449
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
288 #if POW_FRAC_BITS > FRAC_BITS |
|
407
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
289 a = (a + (1 << (POW_FRAC_BITS - FRAC_BITS - 1))) >> (POW_FRAC_BITS - FRAC_BITS); |
|
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
290 /* correct overflow */ |
|
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
291 if (a >= 2 * (1 << FRAC_BITS)) { |
|
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
292 a = a >> 1; |
|
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
293 eq++; |
|
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
294 } |
|
c3aebacf546e
fixed incorrect global gain - slightly increased precision of n^(4/3) table
glantau
parents:
404
diff
changeset
|
295 #endif |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
296 *exp_ptr = eq; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
297 return a; |
|
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
298 } |
|
2522
e25782262d7d
kill warnings patch by (M?ns Rullg?rd <mru inprovide com>)
michael
parents:
2507
diff
changeset
|
299 #endif |
| 0 | 300 |
|
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8718
diff
changeset
|
301 static av_cold int decode_init(AVCodecContext * avctx) |
| 0 | 302 { |
| 303 MPADecodeContext *s = avctx->priv_data; | |
|
836
932eb34d17c1
vc++ sucks, found by ("csharprules" <csharprules at hotmail dot com>)
michaelni
parents:
602
diff
changeset
|
304 static int init=0; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
305 int i, j, k; |
| 0 | 306 |
| 4652 | 307 s->avctx = avctx; |
| 308 | |
|
8598
6550218be3b7
simplify: group all the AUDIO_NONSHORT parameters in the same place
aurel
parents:
8594
diff
changeset
|
309 avctx->sample_fmt= OUT_FMT; |
| 7831 | 310 s->error_recognition= avctx->error_recognition; |
| 2967 | 311 |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
312 if (!init && !avctx->parse_only) { |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
313 int offset; |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
314 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
315 /* scale factors table for layer 1/2 */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
316 for(i=0;i<64;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
317 int shift, mod; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
318 /* 1.0 (i = 3) is normalized to 2 ^ FRAC_BITS */ |
|
449
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
319 shift = (i / 3); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
320 mod = i % 3; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
321 scale_factor_modshift[i] = mod | (shift << 2); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
322 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
323 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
324 /* scale factor multiply for layer 1 */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
325 for(i=0;i<15;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
326 int n, norm; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
327 n = i + 2; |
| 4274 | 328 norm = ((INT64_C(1) << n) * FRAC_ONE) / ((1 << n) - 1); |
| 11707 | 329 scale_factor_mult[i][0] = MULLx(norm, FIXR(1.0 * 2.0), FRAC_BITS); |
| 330 scale_factor_mult[i][1] = MULLx(norm, FIXR(0.7937005259 * 2.0), FRAC_BITS); | |
| 331 scale_factor_mult[i][2] = MULLx(norm, FIXR(0.6299605249 * 2.0), FRAC_BITS); | |
| 4652 | 332 dprintf(avctx, "%d: norm=%x s=%x %x %x\n", |
| 2967 | 333 i, norm, |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
334 scale_factor_mult[i][0], |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
335 scale_factor_mult[i][1], |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
336 scale_factor_mult[i][2]); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
337 } |
| 2967 | 338 |
| 11707 | 339 RENAME(ff_mpa_synth_init)(RENAME(ff_mpa_synth_window)); |
| 2967 | 340 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
341 /* huffman decode tables */ |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
342 offset = 0; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
343 for(i=1;i<16;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
344 const HuffTable *h = &mpa_huff_tables[i]; |
| 2979 | 345 int xsize, x, y; |
| 3627 | 346 uint8_t tmp_bits [512]; |
| 347 uint16_t tmp_codes[512]; | |
| 3608 | 348 |
| 349 memset(tmp_bits , 0, sizeof(tmp_bits )); | |
| 350 memset(tmp_codes, 0, sizeof(tmp_codes)); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
351 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
352 xsize = h->xsize; |
| 2967 | 353 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
354 j = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
355 for(x=0;x<xsize;x++) { |
| 3608 | 356 for(y=0;y<xsize;y++){ |
| 3627 | 357 tmp_bits [(x << 5) | y | ((x&&y)<<4)]= h->bits [j ]; |
| 358 tmp_codes[(x << 5) | y | ((x&&y)<<4)]= h->codes[j++]; | |
| 3608 | 359 } |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
360 } |
| 3608 | 361 |
| 362 /* XXX: fail test */ | |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
363 huff_vlc[i].table = huff_vlc_tables+offset; |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
364 huff_vlc[i].table_allocated = huff_vlc_tables_sizes[i]; |
| 3627 | 365 init_vlc(&huff_vlc[i], 7, 512, |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
366 tmp_bits, 1, 1, tmp_codes, 2, 2, |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
367 INIT_VLC_USE_NEW_STATIC); |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
368 offset += huff_vlc_tables_sizes[i]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
369 } |
| 8042 | 370 assert(offset == FF_ARRAY_ELEMS(huff_vlc_tables)); |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
371 |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
372 offset = 0; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
373 for(i=0;i<2;i++) { |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
374 huff_quad_vlc[i].table = huff_quad_vlc_tables+offset; |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
375 huff_quad_vlc[i].table_allocated = huff_quad_vlc_tables_sizes[i]; |
| 2967 | 376 init_vlc(&huff_quad_vlc[i], i == 0 ? 7 : 4, 16, |
|
7452
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
377 mpa_quad_bits[i], 1, 1, mpa_quad_codes[i], 1, 1, |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
378 INIT_VLC_USE_NEW_STATIC); |
|
2240c6340eac
Use static vlc structure to decode layer 3 huffman tables.
benoit
parents:
7330
diff
changeset
|
379 offset += huff_quad_vlc_tables_sizes[i]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
380 } |
| 8042 | 381 assert(offset == FF_ARRAY_ELEMS(huff_quad_vlc_tables)); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
382 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
383 for(i=0;i<9;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
384 k = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
385 for(j=0;j<22;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
386 band_index_long[i][j] = k; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
387 k += band_size_long[i][j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
388 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
389 band_index_long[i][22] = k; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
390 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
391 |
| 2979 | 392 /* compute n ^ (4/3) and store it in mantissa/exp format */ |
| 2967 | 393 |
|
392
4ef26ed29399
put all integer init code to compute n^(4/3) - memory alloc and header fixes
glantau
parents:
322
diff
changeset
|
394 int_pow_init(); |
|
10469
23ca6d60184d
Add support for hardcoding the mpegaudiodec tables.
reimar
parents:
10440
diff
changeset
|
395 mpegaudio_tableinit(); |
| 2967 | 396 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
397 for(i=0;i<7;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
398 float f; |
| 11707 | 399 INTFLOAT v; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
400 if (i != 6) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
401 f = tan((double)i * M_PI / 12.0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
402 v = FIXR(f / (1.0 + f)); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
403 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
404 v = FIXR(1.0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
405 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
406 is_table[0][i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
407 is_table[1][6 - i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
408 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
409 /* invalid values */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
410 for(i=7;i<16;i++) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
411 is_table[0][i] = is_table[1][i] = 0.0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
412 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
413 for(i=0;i<16;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
414 double f; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
415 int e, k; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
416 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
417 for(j=0;j<2;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
418 e = -(j + 1) * ((i + 1) >> 1); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
419 f = pow(2.0, e / 4.0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
420 k = i & 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
421 is_table_lsf[j][k ^ 1][i] = FIXR(f); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
422 is_table_lsf[j][k][i] = FIXR(1.0); |
| 4652 | 423 dprintf(avctx, "is_table_lsf %d %d: %x %x\n", |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
424 i, j, is_table_lsf[j][0][i], is_table_lsf[j][1][i]); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
425 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
426 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
427 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
428 for(i=0;i<8;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
429 float ci, cs, ca; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
430 ci = ci_table[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
431 cs = 1.0 / sqrt(1.0 + ci * ci); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
432 ca = cs * ci; |
| 2491 | 433 csa_table[i][0] = FIXHR(cs/4); |
| 434 csa_table[i][1] = FIXHR(ca/4); | |
| 435 csa_table[i][2] = FIXHR(ca/4) + FIXHR(cs/4); | |
| 2967 | 436 csa_table[i][3] = FIXHR(ca/4) - FIXHR(cs/4); |
|
1733
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
437 csa_table_float[i][0] = cs; |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
438 csa_table_float[i][1] = ca; |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
439 csa_table_float[i][2] = ca + cs; |
| 2967 | 440 csa_table_float[i][3] = ca - cs; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
441 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
442 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
443 /* compute mdct windows */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
444 for(i=0;i<36;i++) { |
| 2489 | 445 for(j=0; j<4; j++){ |
| 446 double d; | |
| 2967 | 447 |
| 2495 | 448 if(j==2 && i%3 != 1) |
| 449 continue; | |
| 2967 | 450 |
| 2489 | 451 d= sin(M_PI * (i + 0.5) / 36.0); |
| 452 if(j==1){ | |
| 453 if (i>=30) d= 0; | |
| 454 else if(i>=24) d= sin(M_PI * (i - 18 + 0.5) / 12.0); | |
| 455 else if(i>=18) d= 1; | |
| 456 }else if(j==3){ | |
| 457 if (i< 6) d= 0; | |
| 458 else if(i< 12) d= sin(M_PI * (i - 6 + 0.5) / 12.0); | |
| 459 else if(i< 18) d= 1; | |
| 460 } | |
| 461 //merge last stage of imdct into the window coefficients | |
| 2495 | 462 d*= 0.5 / cos(M_PI*(2*i + 19)/72); |
| 463 | |
| 464 if(j==2) | |
| 465 mdct_win[j][i/3] = FIXHR((d / (1<<5))); | |
| 466 else | |
| 467 mdct_win[j][i ] = FIXHR((d / (1<<5))); | |
| 2489 | 468 } |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
469 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
470 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
471 /* NOTE: we do frequency inversion adter the MDCT by changing |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
472 the sign of the right window coefs */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
473 for(j=0;j<4;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
474 for(i=0;i<36;i+=2) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
475 mdct_win[j + 4][i] = mdct_win[j][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
476 mdct_win[j + 4][i + 1] = -mdct_win[j][i + 1]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
477 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
478 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
479 |
| 0 | 480 init = 1; |
| 481 } | |
| 482 | |
| 2432 | 483 if (avctx->codec_id == CODEC_ID_MP3ADU) |
| 484 s->adu_mode = 1; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
485 return 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
486 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
487 |
|
1014
48349e11c9b2
C99 initializers and kill warnings patch by (mru at users dot sourceforge dot net (M?ns Rullg?rd))
michaelni
parents:
902
diff
changeset
|
488 /* tab[i][j] = 1.0 / (2.0 * cos(pi*(2*k+1) / 2^(6 - j))) */ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
489 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
490 /* cos(i*pi/64) */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
491 |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
492 #define COS0_0 FIXHR(0.50060299823519630134/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
493 #define COS0_1 FIXHR(0.50547095989754365998/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
494 #define COS0_2 FIXHR(0.51544730992262454697/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
495 #define COS0_3 FIXHR(0.53104259108978417447/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
496 #define COS0_4 FIXHR(0.55310389603444452782/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
497 #define COS0_5 FIXHR(0.58293496820613387367/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
498 #define COS0_6 FIXHR(0.62250412303566481615/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
499 #define COS0_7 FIXHR(0.67480834145500574602/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
500 #define COS0_8 FIXHR(0.74453627100229844977/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
501 #define COS0_9 FIXHR(0.83934964541552703873/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
502 #define COS0_10 FIXHR(0.97256823786196069369/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
503 #define COS0_11 FIXHR(1.16943993343288495515/4) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
504 #define COS0_12 FIXHR(1.48416461631416627724/4) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
505 #define COS0_13 FIXHR(2.05778100995341155085/8) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
506 #define COS0_14 FIXHR(3.40760841846871878570/8) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
507 #define COS0_15 FIXHR(10.19000812354805681150/32) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
508 |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
509 #define COS1_0 FIXHR(0.50241928618815570551/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
510 #define COS1_1 FIXHR(0.52249861493968888062/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
511 #define COS1_2 FIXHR(0.56694403481635770368/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
512 #define COS1_3 FIXHR(0.64682178335999012954/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
513 #define COS1_4 FIXHR(0.78815462345125022473/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
514 #define COS1_5 FIXHR(1.06067768599034747134/4) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
515 #define COS1_6 FIXHR(1.72244709823833392782/4) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
516 #define COS1_7 FIXHR(5.10114861868916385802/16) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
517 |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
518 #define COS2_0 FIXHR(0.50979557910415916894/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
519 #define COS2_1 FIXHR(0.60134488693504528054/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
520 #define COS2_2 FIXHR(0.89997622313641570463/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
521 #define COS2_3 FIXHR(2.56291544774150617881/8) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
522 |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
523 #define COS3_0 FIXHR(0.54119610014619698439/2) |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
524 #define COS3_1 FIXHR(1.30656296487637652785/4) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
525 |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
526 #define COS4_0 FIXHR(0.70710678118654752439/2) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
527 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
528 /* butterfly operator */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
529 #define BF(a, b, c, s)\ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
530 {\ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
531 tmp0 = val##a + val##b;\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
532 tmp1 = val##a - val##b;\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
533 val##a = tmp0;\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
534 val##b = MULH3(tmp1, c, 1<<(s));\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
535 } |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
536 |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
537 #define BF0(a, b, c, s)\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
538 {\ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
539 tmp0 = tab[a] + tab[b];\ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
540 tmp1 = tab[a] - tab[b];\ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
541 val##a = tmp0;\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
542 val##b = MULH3(tmp1, c, 1<<(s));\ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
543 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
544 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
545 #define BF1(a, b, c, d)\ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
546 {\ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
547 BF(a, b, COS4_0, 1);\ |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
548 BF(c, d,-COS4_0, 1);\ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
549 val##c += val##d;\ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
550 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
551 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
552 #define BF2(a, b, c, d)\ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
553 {\ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
554 BF(a, b, COS4_0, 1);\ |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
555 BF(c, d,-COS4_0, 1);\ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
556 val##c += val##d;\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
557 val##a += val##c;\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
558 val##c += val##b;\ |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
559 val##b += val##d;\ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
560 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
561 |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
562 #define ADD(a, b) val##a += val##b |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
563 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
564 /* DCT32 without 1/sqrt(2) coef zero scaling. */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
565 static void dct32(INTFLOAT *out, const INTFLOAT *tab) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
566 { |
| 11707 | 567 INTFLOAT tmp0, tmp1; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
568 |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
569 INTFLOAT val0 , val1 , val2 , val3 , val4 , val5 , val6 , val7 , |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
570 val8 , val9 , val10, val11, val12, val13, val14, val15, |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
571 val16, val17, val18, val19, val20, val21, val22, val23, |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
572 val24, val25, val26, val27, val28, val29, val30, val31; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
573 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
574 /* pass 1 */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
575 BF0( 0, 31, COS0_0 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
576 BF0(15, 16, COS0_15, 5); |
| 3598 | 577 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
578 BF( 0, 15, COS1_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
579 BF(16, 31,-COS1_0 , 1); |
| 3598 | 580 /* pass 1 */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
581 BF0( 7, 24, COS0_7 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
582 BF0( 8, 23, COS0_8 , 1); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
583 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
584 BF( 7, 8, COS1_7 , 4); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
585 BF(23, 24,-COS1_7 , 4); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
586 /* pass 3 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
587 BF( 0, 7, COS2_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
588 BF( 8, 15,-COS2_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
589 BF(16, 23, COS2_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
590 BF(24, 31,-COS2_0 , 1); |
| 3598 | 591 /* pass 1 */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
592 BF0( 3, 28, COS0_3 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
593 BF0(12, 19, COS0_12, 2); |
| 3598 | 594 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
595 BF( 3, 12, COS1_3 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
596 BF(19, 28,-COS1_3 , 1); |
| 3598 | 597 /* pass 1 */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
598 BF0( 4, 27, COS0_4 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
599 BF0(11, 20, COS0_11, 2); |
| 3598 | 600 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
601 BF( 4, 11, COS1_4 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
602 BF(20, 27,-COS1_4 , 1); |
| 3598 | 603 /* pass 3 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
604 BF( 3, 4, COS2_3 , 3); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
605 BF(11, 12,-COS2_3 , 3); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
606 BF(19, 20, COS2_3 , 3); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
607 BF(27, 28,-COS2_3 , 3); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
608 /* pass 4 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
609 BF( 0, 3, COS3_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
610 BF( 4, 7,-COS3_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
611 BF( 8, 11, COS3_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
612 BF(12, 15,-COS3_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
613 BF(16, 19, COS3_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
614 BF(20, 23,-COS3_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
615 BF(24, 27, COS3_0 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
616 BF(28, 31,-COS3_0 , 1); |
| 2967 | 617 |
| 618 | |
| 619 | |
| 3598 | 620 /* pass 1 */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
621 BF0( 1, 30, COS0_1 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
622 BF0(14, 17, COS0_14, 3); |
| 3598 | 623 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
624 BF( 1, 14, COS1_1 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
625 BF(17, 30,-COS1_1 , 1); |
| 3598 | 626 /* pass 1 */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
627 BF0( 6, 25, COS0_6 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
628 BF0( 9, 22, COS0_9 , 1); |
| 3598 | 629 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
630 BF( 6, 9, COS1_6 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
631 BF(22, 25,-COS1_6 , 2); |
| 3598 | 632 /* pass 3 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
633 BF( 1, 6, COS2_1 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
634 BF( 9, 14,-COS2_1 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
635 BF(17, 22, COS2_1 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
636 BF(25, 30,-COS2_1 , 1); |
| 3598 | 637 |
| 638 /* pass 1 */ | |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
639 BF0( 2, 29, COS0_2 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
640 BF0(13, 18, COS0_13, 3); |
| 3598 | 641 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
642 BF( 2, 13, COS1_2 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
643 BF(18, 29,-COS1_2 , 1); |
| 3598 | 644 /* pass 1 */ |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
645 BF0( 5, 26, COS0_5 , 1); |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
646 BF0(10, 21, COS0_10, 1); |
| 3598 | 647 /* pass 2 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
648 BF( 5, 10, COS1_5 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
649 BF(21, 26,-COS1_5 , 2); |
| 3598 | 650 /* pass 3 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
651 BF( 2, 5, COS2_2 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
652 BF(10, 13,-COS2_2 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
653 BF(18, 21, COS2_2 , 1); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
654 BF(26, 29,-COS2_2 , 1); |
| 3598 | 655 /* pass 4 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
656 BF( 1, 2, COS3_1 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
657 BF( 5, 6,-COS3_1 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
658 BF( 9, 10, COS3_1 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
659 BF(13, 14,-COS3_1 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
660 BF(17, 18, COS3_1 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
661 BF(21, 22,-COS3_1 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
662 BF(25, 26, COS3_1 , 2); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
663 BF(29, 30,-COS3_1 , 2); |
| 2967 | 664 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
665 /* pass 5 */ |
|
3600
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
666 BF1( 0, 1, 2, 3); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
667 BF2( 4, 5, 6, 7); |
|
949219039897
replace MULL by MULH + shift in dct32() (code is very slightly faster, and the compiler should be able to optimize the shift away on 64bit archs)
michael
parents:
3599
diff
changeset
|
668 BF1( 8, 9, 10, 11); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
669 BF2(12, 13, 14, 15); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
670 BF1(16, 17, 18, 19); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
671 BF2(20, 21, 22, 23); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
672 BF1(24, 25, 26, 27); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
673 BF2(28, 29, 30, 31); |
| 2967 | 674 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
675 /* pass 6 */ |
| 2967 | 676 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
677 ADD( 8, 12); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
678 ADD(12, 10); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
679 ADD(10, 14); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
680 ADD(14, 9); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
681 ADD( 9, 13); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
682 ADD(13, 11); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
683 ADD(11, 15); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
684 |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
685 out[ 0] = val0; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
686 out[16] = val1; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
687 out[ 8] = val2; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
688 out[24] = val3; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
689 out[ 4] = val4; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
690 out[20] = val5; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
691 out[12] = val6; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
692 out[28] = val7; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
693 out[ 2] = val8; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
694 out[18] = val9; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
695 out[10] = val10; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
696 out[26] = val11; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
697 out[ 6] = val12; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
698 out[22] = val13; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
699 out[14] = val14; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
700 out[30] = val15; |
| 2967 | 701 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
702 ADD(24, 28); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
703 ADD(28, 26); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
704 ADD(26, 30); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
705 ADD(30, 25); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
706 ADD(25, 29); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
707 ADD(29, 27); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
708 ADD(27, 31); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
709 |
|
11845
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
710 out[ 1] = val16 + val24; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
711 out[17] = val17 + val25; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
712 out[ 9] = val18 + val26; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
713 out[25] = val19 + val27; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
714 out[ 5] = val20 + val28; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
715 out[21] = val21 + val29; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
716 out[13] = val22 + val30; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
717 out[29] = val23 + val31; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
718 out[ 3] = val24 + val20; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
719 out[19] = val25 + val21; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
720 out[11] = val26 + val22; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
721 out[27] = val27 + val23; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
722 out[ 7] = val28 + val18; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
723 out[23] = val29 + val19; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
724 out[15] = val30 + val17; |
|
f21bbfe942d4
Optimize 1D DCT transform used in MP{1,2,3}. Makes also this function suitable
vitor
parents:
11723
diff
changeset
|
725 out[31] = val31; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
726 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
727 |
| 11707 | 728 #if CONFIG_FLOAT |
| 729 static inline float round_sample(float *sum) | |
| 730 { | |
| 731 float sum1=*sum; | |
| 732 *sum = 0; | |
| 733 return sum1; | |
| 734 } | |
| 735 | |
| 736 /* signed 16x16 -> 32 multiply add accumulate */ | |
| 737 #define MACS(rt, ra, rb) rt+=(ra)*(rb) | |
| 738 | |
| 739 /* signed 16x16 -> 32 multiply */ | |
| 740 #define MULS(ra, rb) ((ra)*(rb)) | |
| 741 | |
| 742 #define MLSS(rt, ra, rb) rt-=(ra)*(rb) | |
| 743 | |
| 744 #elif FRAC_BITS <= 15 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
745 |
| 2472 | 746 static inline int round_sample(int *sum) |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
747 { |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
748 int sum1; |
| 2472 | 749 sum1 = (*sum) >> OUT_SHIFT; |
| 750 *sum &= (1<<OUT_SHIFT)-1; | |
| 9601 | 751 return av_clip(sum1, OUT_MIN, OUT_MAX); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
752 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
753 |
| 3752 | 754 /* signed 16x16 -> 32 multiply add accumulate */ |
| 755 #define MACS(rt, ra, rb) MAC16(rt, ra, rb) | |
| 3705 | 756 |
| 3752 | 757 /* signed 16x16 -> 32 multiply */ |
| 758 #define MULS(ra, rb) MUL16(ra, rb) | |
| 3705 | 759 |
| 7256 | 760 #define MLSS(rt, ra, rb) MLS16(rt, ra, rb) |
| 761 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
762 #else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
763 |
| 2967 | 764 static inline int round_sample(int64_t *sum) |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
765 { |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
766 int sum1; |
| 2472 | 767 sum1 = (int)((*sum) >> OUT_SHIFT); |
| 768 *sum &= (1<<OUT_SHIFT)-1; | |
| 9601 | 769 return av_clip(sum1, OUT_MIN, OUT_MAX); |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
770 } |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
771 |
| 3603 | 772 # define MULS(ra, rb) MUL64(ra, rb) |
| 7256 | 773 # define MACS(rt, ra, rb) MAC64(rt, ra, rb) |
| 774 # define MLSS(rt, ra, rb) MLS64(rt, ra, rb) | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
775 #endif |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
776 |
| 7256 | 777 #define SUM8(op, sum, w, p) \ |
| 778 { \ | |
|
9603
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
779 op(sum, (w)[0 * 64], (p)[0 * 64]); \ |
|
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
780 op(sum, (w)[1 * 64], (p)[1 * 64]); \ |
|
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
781 op(sum, (w)[2 * 64], (p)[2 * 64]); \ |
|
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
782 op(sum, (w)[3 * 64], (p)[3 * 64]); \ |
|
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
783 op(sum, (w)[4 * 64], (p)[4 * 64]); \ |
|
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
784 op(sum, (w)[5 * 64], (p)[5 * 64]); \ |
|
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
785 op(sum, (w)[6 * 64], (p)[6 * 64]); \ |
|
875cd15dfd74
mpegaudio: enclose SUM8() macro args in parens when used
mru
parents:
9602
diff
changeset
|
786 op(sum, (w)[7 * 64], (p)[7 * 64]); \ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
787 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
788 |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
789 #define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \ |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
790 { \ |
| 11707 | 791 INTFLOAT tmp;\ |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
792 tmp = p[0 * 64];\ |
| 7256 | 793 op1(sum1, (w1)[0 * 64], tmp);\ |
| 794 op2(sum2, (w2)[0 * 64], tmp);\ | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
795 tmp = p[1 * 64];\ |
| 7256 | 796 op1(sum1, (w1)[1 * 64], tmp);\ |
| 797 op2(sum2, (w2)[1 * 64], tmp);\ | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
798 tmp = p[2 * 64];\ |
| 7256 | 799 op1(sum1, (w1)[2 * 64], tmp);\ |
| 800 op2(sum2, (w2)[2 * 64], tmp);\ | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
801 tmp = p[3 * 64];\ |
| 7256 | 802 op1(sum1, (w1)[3 * 64], tmp);\ |
| 803 op2(sum2, (w2)[3 * 64], tmp);\ | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
804 tmp = p[4 * 64];\ |
| 7256 | 805 op1(sum1, (w1)[4 * 64], tmp);\ |
| 806 op2(sum2, (w2)[4 * 64], tmp);\ | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
807 tmp = p[5 * 64];\ |
| 7256 | 808 op1(sum1, (w1)[5 * 64], tmp);\ |
| 809 op2(sum2, (w2)[5 * 64], tmp);\ | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
810 tmp = p[6 * 64];\ |
| 7256 | 811 op1(sum1, (w1)[6 * 64], tmp);\ |
| 812 op2(sum2, (w2)[6 * 64], tmp);\ | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
813 tmp = p[7 * 64];\ |
| 7256 | 814 op1(sum1, (w1)[7 * 64], tmp);\ |
| 815 op2(sum2, (w2)[7 * 64], tmp);\ | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
816 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
817 |
| 11707 | 818 void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window) |
|
2468
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
819 { |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
820 int i; |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
821 |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
822 /* max = 18760, max sum over all 16 coefs : 44736 */ |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
823 for(i=0;i<257;i++) { |
| 11707 | 824 INTFLOAT v; |
| 5032 | 825 v = ff_mpa_enwindow[i]; |
| 11707 | 826 #if CONFIG_FLOAT |
| 827 v *= 1.0 / (1LL<<(16 + FRAC_BITS)); | |
| 828 #elif WFRAC_BITS < 16 | |
|
2468
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
829 v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS); |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
830 #endif |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
831 window[i] = v; |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
832 if ((i & 63) != 0) |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
833 v = -v; |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
834 if (i != 0) |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
835 window[512 - i] = v; |
| 2967 | 836 } |
|
2468
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
837 } |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
838 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
839 /* 32 sub band synthesis filter. Input: 32 sub band samples, Output: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
840 32 samples. */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
841 /* XXX: optimize by avoiding ring buffer usage */ |
| 11707 | 842 void RENAME(ff_mpa_synth_filter)(MPA_INT *synth_buf_ptr, int *synth_buf_offset, |
| 2979 | 843 MPA_INT *window, int *dither_state, |
| 2967 | 844 OUT_INT *samples, int incr, |
| 11707 | 845 INTFLOAT sb_samples[SBLIMIT]) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
846 { |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
847 register MPA_INT *synth_buf; |
| 2100 | 848 register const MPA_INT *w, *w2, *p; |
|
9602
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
849 int j, offset; |
| 2479 | 850 OUT_INT *samples2; |
| 11707 | 851 #if CONFIG_FLOAT |
| 852 float sum, sum2; | |
| 853 #elif FRAC_BITS <= 15 | |
|
9602
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
854 int32_t tmp[32]; |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
855 int sum, sum2; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
856 #else |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
857 int64_t sum, sum2; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
858 #endif |
|
2468
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
859 |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
860 offset = *synth_buf_offset; |
|
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
861 synth_buf = synth_buf_ptr + offset; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
862 |
|
11716
fcb1d0addf28
Fix compilation with low precission mpeg audio decoding.
michael
parents:
11711
diff
changeset
|
863 #if FRAC_BITS <= 15 && !CONFIG_FLOAT |
|
9602
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
864 dct32(tmp, sb_samples); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
865 for(j=0;j<32;j++) { |
|
449
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
866 /* NOTE: can cause a loss in precision if very high amplitude |
|
7b2f23b5dcdd
fixed layer1/2 overflow if very loud sound - fixed broken free format decoding to pass all mpeg audio standard decoding tests (please avoid patching the parser without having all test streams available - contact me if necessary)
bellard
parents:
440
diff
changeset
|
867 sound */ |
|
9602
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
868 synth_buf[j] = av_clip_int16(tmp[j]); |
|
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
869 } |
|
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
870 #else |
|
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
871 dct32(synth_buf, sb_samples); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
872 #endif |
|
9602
9e7665d68111
mpegaudio: avoid unnecessary copy in high-precision mode
mru
parents:
9601
diff
changeset
|
873 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
874 /* copy to avoid wrap */ |
| 11707 | 875 memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf)); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
876 |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
877 samples2 = samples + 31 * incr; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
878 w = window; |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
879 w2 = window + 31; |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
880 |
| 2473 | 881 sum = *dither_state; |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
882 p = synth_buf + 16; |
| 7256 | 883 SUM8(MACS, sum, w, p); |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
884 p = synth_buf + 48; |
| 7256 | 885 SUM8(MLSS, sum, w + 32, p); |
| 2472 | 886 *samples = round_sample(&sum); |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
887 samples += incr; |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
888 w++; |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
889 |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
890 /* we calculate two samples at the same time to avoid one memory |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
891 access per two sample */ |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
892 for(j=1;j<16;j++) { |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
893 sum2 = 0; |
|
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
894 p = synth_buf + 16 + j; |
| 7256 | 895 SUM8P2(sum, MACS, sum2, MLSS, w, w2, p); |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
896 p = synth_buf + 48 - j; |
| 7256 | 897 SUM8P2(sum, MLSS, sum2, MLSS, w + 32, w2 + 32, p); |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
898 |
| 2472 | 899 *samples = round_sample(&sum); |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
900 samples += incr; |
| 2472 | 901 sum += sum2; |
| 902 *samples2 = round_sample(&sum); | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
903 samples2 -= incr; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
904 w++; |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
905 w2--; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
906 } |
| 2967 | 907 |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
908 p = synth_buf + 32; |
| 7256 | 909 SUM8(MLSS, sum, w + 32, p); |
| 2472 | 910 *samples = round_sample(&sum); |
| 2473 | 911 *dither_state= sum; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
912 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
913 offset = (offset - 32) & 511; |
|
2468
1addaf6facbb
exported ff_mpa_synth_filter for upcoming qdm2 decoder
alex
parents:
2432
diff
changeset
|
914 *synth_buf_offset = offset; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
915 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
916 |
| 2495 | 917 #define C3 FIXHR(0.86602540378443864676/2) |
| 918 | |
| 919 /* 0.5 / cos(pi*(2*i+1)/36) */ | |
| 11707 | 920 static const INTFLOAT icos36[9] = { |
| 2495 | 921 FIXR(0.50190991877167369479), |
| 922 FIXR(0.51763809020504152469), //0 | |
| 923 FIXR(0.55168895948124587824), | |
| 924 FIXR(0.61038729438072803416), | |
| 925 FIXR(0.70710678118654752439), //1 | |
| 926 FIXR(0.87172339781054900991), | |
| 927 FIXR(1.18310079157624925896), | |
| 928 FIXR(1.93185165257813657349), //2 | |
| 929 FIXR(5.73685662283492756461), | |
| 930 }; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
931 |
| 3599 | 932 /* 0.5 / cos(pi*(2*i+1)/36) */ |
| 11707 | 933 static const INTFLOAT icos36h[9] = { |
| 3599 | 934 FIXHR(0.50190991877167369479/2), |
| 935 FIXHR(0.51763809020504152469/2), //0 | |
| 936 FIXHR(0.55168895948124587824/2), | |
| 937 FIXHR(0.61038729438072803416/2), | |
| 938 FIXHR(0.70710678118654752439/2), //1 | |
| 939 FIXHR(0.87172339781054900991/2), | |
| 940 FIXHR(1.18310079157624925896/4), | |
| 941 FIXHR(1.93185165257813657349/4), //2 | |
| 942 // FIXHR(5.73685662283492756461), | |
| 943 }; | |
| 944 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
945 /* 12 points IMDCT. We compute it "by hand" by factorizing obvious |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
946 cases. */ |
| 11707 | 947 static void imdct12(INTFLOAT *out, INTFLOAT *in) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
948 { |
| 11707 | 949 INTFLOAT in0, in1, in2, in3, in4, in5, t1, t2; |
|
2496
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
950 |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
951 in0= in[0*3]; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
952 in1= in[1*3] + in[0*3]; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
953 in2= in[2*3] + in[1*3]; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
954 in3= in[3*3] + in[2*3]; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
955 in4= in[4*3] + in[3*3]; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
956 in5= in[5*3] + in[4*3]; |
| 2495 | 957 in5 += in3; |
| 958 in3 += in1; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
959 |
| 11707 | 960 in2= MULH3(in2, C3, 2); |
| 961 in3= MULH3(in3, C3, 4); | |
| 2967 | 962 |
| 2495 | 963 t1 = in0 - in4; |
| 11707 | 964 t2 = MULH3(in1 - in5, icos36h[4], 2); |
| 2495 | 965 |
| 2967 | 966 out[ 7]= |
| 2495 | 967 out[10]= t1 + t2; |
| 968 out[ 1]= | |
| 969 out[ 4]= t1 - t2; | |
| 970 | |
| 11707 | 971 in0 += SHR(in4, 1); |
| 2495 | 972 in4 = in0 + in2; |
| 3599 | 973 in5 += 2*in1; |
| 11707 | 974 in1 = MULH3(in5 + in3, icos36h[1], 1); |
| 2967 | 975 out[ 8]= |
| 3599 | 976 out[ 9]= in4 + in1; |
| 2495 | 977 out[ 2]= |
| 3599 | 978 out[ 3]= in4 - in1; |
| 2967 | 979 |
| 2495 | 980 in0 -= in2; |
| 11707 | 981 in5 = MULH3(in5 - in3, icos36h[7], 2); |
| 2495 | 982 out[ 0]= |
| 3599 | 983 out[ 5]= in0 - in5; |
| 2495 | 984 out[ 6]= |
| 3599 | 985 out[11]= in0 + in5; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
986 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
987 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
988 /* cos(pi*i/18) */ |
| 2489 | 989 #define C1 FIXHR(0.98480775301220805936/2) |
| 990 #define C2 FIXHR(0.93969262078590838405/2) | |
| 991 #define C3 FIXHR(0.86602540378443864676/2) | |
| 992 #define C4 FIXHR(0.76604444311897803520/2) | |
| 993 #define C5 FIXHR(0.64278760968653932632/2) | |
| 994 #define C6 FIXHR(0.5/2) | |
| 995 #define C7 FIXHR(0.34202014332566873304/2) | |
| 996 #define C8 FIXHR(0.17364817766693034885/2) | |
| 997 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
998 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
999 /* using Lee like decomposition followed by hand coded 9 points DCT */ |
| 11707 | 1000 static void imdct36(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in, INTFLOAT *win) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1001 { |
| 11707 | 1002 int i, j; |
| 1003 INTFLOAT t0, t1, t2, t3, s0, s1, s2, s3; | |
| 1004 INTFLOAT tmp[18], *tmp1, *in1; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1005 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1006 for(i=17;i>=1;i--) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1007 in[i] += in[i-1]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1008 for(i=17;i>=3;i-=2) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1009 in[i] += in[i-2]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1010 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1011 for(j=0;j<2;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1012 tmp1 = tmp + j; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1013 in1 = in + j; |
| 11707 | 1014 |
| 2489 | 1015 t2 = in1[2*4] + in1[2*8] - in1[2*2]; |
| 2967 | 1016 |
| 11707 | 1017 t3 = in1[2*0] + SHR(in1[2*6],1); |
| 2489 | 1018 t1 = in1[2*0] - in1[2*6]; |
| 11707 | 1019 tmp1[ 6] = t1 - SHR(t2,1); |
| 2489 | 1020 tmp1[16] = t1 + t2; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1021 |
| 11707 | 1022 t0 = MULH3(in1[2*2] + in1[2*4] , C2, 2); |
| 1023 t1 = MULH3(in1[2*4] - in1[2*8] , -2*C8, 1); | |
| 1024 t2 = MULH3(in1[2*2] + in1[2*8] , -C4, 2); | |
| 2967 | 1025 |
| 2489 | 1026 tmp1[10] = t3 - t0 - t2; |
| 1027 tmp1[ 2] = t3 + t0 + t1; | |
| 1028 tmp1[14] = t3 + t2 - t1; | |
| 2967 | 1029 |
| 11707 | 1030 tmp1[ 4] = MULH3(in1[2*5] + in1[2*7] - in1[2*1], -C3, 2); |
| 1031 t2 = MULH3(in1[2*1] + in1[2*5], C1, 2); | |
| 1032 t3 = MULH3(in1[2*5] - in1[2*7], -2*C7, 1); | |
| 1033 t0 = MULH3(in1[2*3], C3, 2); | |
| 2489 | 1034 |
| 11707 | 1035 t1 = MULH3(in1[2*1] + in1[2*7], -C5, 2); |
| 2489 | 1036 |
| 1037 tmp1[ 0] = t2 + t3 + t0; | |
| 1038 tmp1[12] = t2 + t1 - t0; | |
| 1039 tmp1[ 8] = t3 - t1 - t0; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1040 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1041 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1042 i = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1043 for(j=0;j<4;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1044 t0 = tmp[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1045 t1 = tmp[i + 2]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1046 s0 = t1 + t0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1047 s2 = t1 - t0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1048 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1049 t2 = tmp[i + 1]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1050 t3 = tmp[i + 3]; |
| 11707 | 1051 s1 = MULH3(t3 + t2, icos36h[j], 2); |
| 1052 s3 = MULLx(t3 - t2, icos36[8 - j], FRAC_BITS); | |
| 2967 | 1053 |
|
2496
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1054 t0 = s0 + s1; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1055 t1 = s0 - s1; |
| 11707 | 1056 out[(9 + j)*SBLIMIT] = MULH3(t1, win[9 + j], 1) + buf[9 + j]; |
| 1057 out[(8 - j)*SBLIMIT] = MULH3(t1, win[8 - j], 1) + buf[8 - j]; | |
| 1058 buf[9 + j] = MULH3(t0, win[18 + 9 + j], 1); | |
| 1059 buf[8 - j] = MULH3(t0, win[18 + 8 - j], 1); | |
| 2967 | 1060 |
|
2496
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1061 t0 = s2 + s3; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1062 t1 = s2 - s3; |
| 11707 | 1063 out[(9 + 8 - j)*SBLIMIT] = MULH3(t1, win[9 + 8 - j], 1) + buf[9 + 8 - j]; |
| 1064 out[( j)*SBLIMIT] = MULH3(t1, win[ j], 1) + buf[ j]; | |
| 1065 buf[9 + 8 - j] = MULH3(t0, win[18 + 9 + 8 - j], 1); | |
| 1066 buf[ + j] = MULH3(t0, win[18 + j], 1); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1067 i += 4; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1068 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1069 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1070 s0 = tmp[16]; |
| 11707 | 1071 s1 = MULH3(tmp[17], icos36h[4], 2); |
|
2496
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1072 t0 = s0 + s1; |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1073 t1 = s0 - s1; |
| 11707 | 1074 out[(9 + 4)*SBLIMIT] = MULH3(t1, win[9 + 4], 1) + buf[9 + 4]; |
| 1075 out[(8 - 4)*SBLIMIT] = MULH3(t1, win[8 - 4], 1) + buf[8 - 4]; | |
| 1076 buf[9 + 4] = MULH3(t0, win[18 + 9 + 4], 1); | |
| 1077 buf[8 - 4] = MULH3(t0, win[18 + 8 - 4], 1); | |
| 0 | 1078 } |
| 1079 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1080 /* return the number of decoded frames */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1081 static int mp_decode_layer1(MPADecodeContext *s) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1082 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1083 int bound, i, v, n, ch, j, mant; |
| 1064 | 1084 uint8_t allocation[MPA_MAX_CHANNELS][SBLIMIT]; |
| 1085 uint8_t scale_factors[MPA_MAX_CHANNELS][SBLIMIT]; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1086 |
| 2967 | 1087 if (s->mode == MPA_JSTEREO) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1088 bound = (s->mode_ext + 1) * 4; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1089 else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1090 bound = SBLIMIT; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1091 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1092 /* allocation bits */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1093 for(i=0;i<bound;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1094 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1095 allocation[ch][i] = get_bits(&s->gb, 4); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1096 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1097 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1098 for(i=bound;i<SBLIMIT;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1099 allocation[0][i] = get_bits(&s->gb, 4); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1100 } |
| 0 | 1101 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1102 /* scale factors */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1103 for(i=0;i<bound;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1104 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1105 if (allocation[ch][i]) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1106 scale_factors[ch][i] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1107 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1108 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1109 for(i=bound;i<SBLIMIT;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1110 if (allocation[0][i]) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1111 scale_factors[0][i] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1112 scale_factors[1][i] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1113 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1114 } |
| 2967 | 1115 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1116 /* compute samples */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1117 for(j=0;j<12;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1118 for(i=0;i<bound;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1119 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1120 n = allocation[ch][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1121 if (n) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1122 mant = get_bits(&s->gb, n + 1); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1123 v = l1_unscale(n, mant, scale_factors[ch][i]); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1124 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1125 v = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1126 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1127 s->sb_samples[ch][j][i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1128 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1129 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1130 for(i=bound;i<SBLIMIT;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1131 n = allocation[0][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1132 if (n) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1133 mant = get_bits(&s->gb, n + 1); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1134 v = l1_unscale(n, mant, scale_factors[0][i]); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1135 s->sb_samples[0][j][i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1136 v = l1_unscale(n, mant, scale_factors[1][i]); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1137 s->sb_samples[1][j][i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1138 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1139 s->sb_samples[0][j][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1140 s->sb_samples[1][j][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1141 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1142 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1143 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1144 return 12; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1145 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1146 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1147 static int mp_decode_layer2(MPADecodeContext *s) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1148 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1149 int sblimit; /* number of used subbands */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1150 const unsigned char *alloc_table; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1151 int table, bit_alloc_bits, i, j, ch, bound, v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1152 unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1153 unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1154 unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3], *sf; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1155 int scale, qindex, bits, steps, k, l, m, b; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1156 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1157 /* select decoding table */ |
|
5052
d981eb275c8f
remove dependency of mpeg audio encoder over mpeg audio decoder
aurel
parents:
5051
diff
changeset
|
1158 table = ff_mpa_l2_select_table(s->bit_rate / 1000, s->nb_channels, |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1159 s->sample_rate, s->lsf); |
| 5032 | 1160 sblimit = ff_mpa_sblimit_table[table]; |
| 1161 alloc_table = ff_mpa_alloc_tables[table]; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1162 |
| 2967 | 1163 if (s->mode == MPA_JSTEREO) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1164 bound = (s->mode_ext + 1) * 4; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1165 else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1166 bound = sblimit; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1167 |
| 4652 | 1168 dprintf(s->avctx, "bound=%d sblimit=%d\n", bound, sblimit); |
| 1780 | 1169 |
| 1170 /* sanity check */ | |
| 1171 if( bound > sblimit ) bound = sblimit; | |
| 1172 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1173 /* parse bit allocation */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1174 j = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1175 for(i=0;i<bound;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1176 bit_alloc_bits = alloc_table[j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1177 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1178 bit_alloc[ch][i] = get_bits(&s->gb, bit_alloc_bits); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1179 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1180 j += 1 << bit_alloc_bits; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1181 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1182 for(i=bound;i<sblimit;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1183 bit_alloc_bits = alloc_table[j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1184 v = get_bits(&s->gb, bit_alloc_bits); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1185 bit_alloc[0][i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1186 bit_alloc[1][i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1187 j += 1 << bit_alloc_bits; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1188 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1189 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1190 /* scale codes */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1191 for(i=0;i<sblimit;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1192 for(ch=0;ch<s->nb_channels;ch++) { |
| 2967 | 1193 if (bit_alloc[ch][i]) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1194 scale_code[ch][i] = get_bits(&s->gb, 2); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1195 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1196 } |
| 2967 | 1197 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1198 /* scale factors */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1199 for(i=0;i<sblimit;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1200 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1201 if (bit_alloc[ch][i]) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1202 sf = scale_factors[ch][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1203 switch(scale_code[ch][i]) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1204 default: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1205 case 0: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1206 sf[0] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1207 sf[1] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1208 sf[2] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1209 break; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1210 case 2: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1211 sf[0] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1212 sf[1] = sf[0]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1213 sf[2] = sf[0]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1214 break; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1215 case 1: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1216 sf[0] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1217 sf[2] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1218 sf[1] = sf[0]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1219 break; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1220 case 3: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1221 sf[0] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1222 sf[2] = get_bits(&s->gb, 6); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1223 sf[1] = sf[2]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1224 break; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1225 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1226 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1227 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1228 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1229 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1230 /* samples */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1231 for(k=0;k<3;k++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1232 for(l=0;l<12;l+=3) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1233 j = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1234 for(i=0;i<bound;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1235 bit_alloc_bits = alloc_table[j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1236 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1237 b = bit_alloc[ch][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1238 if (b) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1239 scale = scale_factors[ch][i][k]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1240 qindex = alloc_table[j+b]; |
| 5032 | 1241 bits = ff_mpa_quant_bits[qindex]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1242 if (bits < 0) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1243 /* 3 values at the same time */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1244 v = get_bits(&s->gb, -bits); |
| 5032 | 1245 steps = ff_mpa_quant_steps[qindex]; |
| 2967 | 1246 s->sb_samples[ch][k * 12 + l + 0][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1247 l2_unscale_group(steps, v % steps, scale); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1248 v = v / steps; |
| 2967 | 1249 s->sb_samples[ch][k * 12 + l + 1][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1250 l2_unscale_group(steps, v % steps, scale); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1251 v = v / steps; |
| 2967 | 1252 s->sb_samples[ch][k * 12 + l + 2][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1253 l2_unscale_group(steps, v, scale); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1254 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1255 for(m=0;m<3;m++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1256 v = get_bits(&s->gb, bits); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1257 v = l1_unscale(bits - 1, v, scale); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1258 s->sb_samples[ch][k * 12 + l + m][i] = v; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1259 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1260 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1261 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1262 s->sb_samples[ch][k * 12 + l + 0][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1263 s->sb_samples[ch][k * 12 + l + 1][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1264 s->sb_samples[ch][k * 12 + l + 2][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1265 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1266 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1267 /* next subband in alloc table */ |
| 2967 | 1268 j += 1 << bit_alloc_bits; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1269 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1270 /* XXX: find a way to avoid this duplication of code */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1271 for(i=bound;i<sblimit;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1272 bit_alloc_bits = alloc_table[j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1273 b = bit_alloc[0][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1274 if (b) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1275 int mant, scale0, scale1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1276 scale0 = scale_factors[0][i][k]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1277 scale1 = scale_factors[1][i][k]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1278 qindex = alloc_table[j+b]; |
| 5032 | 1279 bits = ff_mpa_quant_bits[qindex]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1280 if (bits < 0) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1281 /* 3 values at the same time */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1282 v = get_bits(&s->gb, -bits); |
| 5032 | 1283 steps = ff_mpa_quant_steps[qindex]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1284 mant = v % steps; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1285 v = v / steps; |
| 2967 | 1286 s->sb_samples[0][k * 12 + l + 0][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1287 l2_unscale_group(steps, mant, scale0); |
| 2967 | 1288 s->sb_samples[1][k * 12 + l + 0][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1289 l2_unscale_group(steps, mant, scale1); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1290 mant = v % steps; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1291 v = v / steps; |
| 2967 | 1292 s->sb_samples[0][k * 12 + l + 1][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1293 l2_unscale_group(steps, mant, scale0); |
| 2967 | 1294 s->sb_samples[1][k * 12 + l + 1][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1295 l2_unscale_group(steps, mant, scale1); |
| 2967 | 1296 s->sb_samples[0][k * 12 + l + 2][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1297 l2_unscale_group(steps, v, scale0); |
| 2967 | 1298 s->sb_samples[1][k * 12 + l + 2][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1299 l2_unscale_group(steps, v, scale1); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1300 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1301 for(m=0;m<3;m++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1302 mant = get_bits(&s->gb, bits); |
| 2967 | 1303 s->sb_samples[0][k * 12 + l + m][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1304 l1_unscale(bits - 1, mant, scale0); |
| 2967 | 1305 s->sb_samples[1][k * 12 + l + m][i] = |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1306 l1_unscale(bits - 1, mant, scale1); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1307 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1308 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1309 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1310 s->sb_samples[0][k * 12 + l + 0][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1311 s->sb_samples[0][k * 12 + l + 1][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1312 s->sb_samples[0][k * 12 + l + 2][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1313 s->sb_samples[1][k * 12 + l + 0][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1314 s->sb_samples[1][k * 12 + l + 1][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1315 s->sb_samples[1][k * 12 + l + 2][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1316 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1317 /* next subband in alloc table */ |
| 2967 | 1318 j += 1 << bit_alloc_bits; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1319 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1320 /* fill remaining samples to zero */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1321 for(i=sblimit;i<SBLIMIT;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1322 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1323 s->sb_samples[ch][k * 12 + l + 0][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1324 s->sb_samples[ch][k * 12 + l + 1][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1325 s->sb_samples[ch][k * 12 + l + 2][i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1326 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1327 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1328 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1329 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1330 return 3 * 12; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1331 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1332 |
| 11708 | 1333 #define SPLIT(dst,sf,n)\ |
| 1334 if(n==3){\ | |
| 1335 int m= (sf*171)>>9;\ | |
| 1336 dst= sf - 3*m;\ | |
| 1337 sf=m;\ | |
| 1338 }else if(n==4){\ | |
| 1339 dst= sf&3;\ | |
| 1340 sf>>=2;\ | |
| 1341 }else if(n==5){\ | |
| 1342 int m= (sf*205)>>10;\ | |
| 1343 dst= sf - 5*m;\ | |
| 1344 sf=m;\ | |
| 1345 }else if(n==6){\ | |
| 1346 int m= (sf*171)>>10;\ | |
| 1347 dst= sf - 6*m;\ | |
| 1348 sf=m;\ | |
| 1349 }else{\ | |
| 1350 dst=0;\ | |
| 1351 } | |
| 1352 | |
| 1353 static av_always_inline void lsf_sf_expand(int *slen, | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1354 int sf, int n1, int n2, int n3) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1355 { |
| 11708 | 1356 SPLIT(slen[3], sf, n3) |
| 1357 SPLIT(slen[2], sf, n2) | |
| 1358 SPLIT(slen[1], sf, n1) | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1359 slen[0] = sf; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1360 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1361 |
| 2967 | 1362 static void exponents_from_scale_factors(MPADecodeContext *s, |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1363 GranuleDef *g, |
| 1064 | 1364 int16_t *exponents) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1365 { |
| 1064 | 1366 const uint8_t *bstab, *pretab; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1367 int len, i, j, k, l, v0, shift, gain, gains[3]; |
| 1064 | 1368 int16_t *exp_ptr; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1369 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1370 exp_ptr = exponents; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1371 gain = g->global_gain - 210; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1372 shift = g->scalefac_scale + 1; |
| 0 | 1373 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1374 bstab = band_size_long[s->sample_rate_index]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1375 pretab = mpa_pretab[g->preflag]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1376 for(i=0;i<g->long_end;i++) { |
| 3625 | 1377 v0 = gain - ((g->scale_factors[i] + pretab[i]) << shift) + 400; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1378 len = bstab[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1379 for(j=len;j>0;j--) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1380 *exp_ptr++ = v0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1381 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1382 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1383 if (g->short_start < 13) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1384 bstab = band_size_short[s->sample_rate_index]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1385 gains[0] = gain - (g->subblock_gain[0] << 3); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1386 gains[1] = gain - (g->subblock_gain[1] << 3); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1387 gains[2] = gain - (g->subblock_gain[2] << 3); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1388 k = g->long_end; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1389 for(i=g->short_start;i<13;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1390 len = bstab[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1391 for(l=0;l<3;l++) { |
| 3625 | 1392 v0 = gains[l] - (g->scale_factors[k++] << shift) + 400; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1393 for(j=len;j>0;j--) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1394 *exp_ptr++ = v0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1395 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1396 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1397 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1398 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1399 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1400 /* handle n = 0 too */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1401 static inline int get_bitsz(GetBitContext *s, int n) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1402 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1403 if (n == 0) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1404 return 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1405 else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1406 return get_bits(s, n); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1407 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1408 |
| 4469 | 1409 |
| 1410 static void switch_buffer(MPADecodeContext *s, int *pos, int *end_pos, int *end_pos2){ | |
| 1411 if(s->in_gb.buffer && *pos >= s->gb.size_in_bits){ | |
| 1412 s->gb= s->in_gb; | |
| 1413 s->in_gb.buffer=NULL; | |
| 1414 assert((get_bits_count(&s->gb) & 7) == 0); | |
| 1415 skip_bits_long(&s->gb, *pos - *end_pos); | |
| 1416 *end_pos2= | |
| 1417 *end_pos= *end_pos2 + get_bits_count(&s->gb) - *pos; | |
| 1418 *pos= get_bits_count(&s->gb); | |
| 1419 } | |
| 1420 } | |
| 1421 | |
| 11710 | 1422 /* Following is a optimized code for |
| 1423 INTFLOAT v = *src | |
| 1424 if(get_bits1(&s->gb)) | |
| 1425 v = -v; | |
| 1426 *dst = v; | |
| 1427 */ | |
| 1428 #if CONFIG_FLOAT | |
| 1429 #define READ_FLIP_SIGN(dst,src)\ | |
| 1430 v = AV_RN32A(src) ^ (get_bits1(&s->gb)<<31);\ | |
| 1431 AV_WN32A(dst, v); | |
| 1432 #else | |
| 1433 #define READ_FLIP_SIGN(dst,src)\ | |
| 1434 v= -get_bits1(&s->gb);\ | |
| 1435 *(dst) = (*(src) ^ v) - v; | |
| 1436 #endif | |
| 1437 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1438 static int huffman_decode(MPADecodeContext *s, GranuleDef *g, |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1439 int16_t *exponents, int end_pos2) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1440 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1441 int s_index; |
|
3626
a6251ee2dfdb
move variable declarations so that their scope is smaller
michael
parents:
3625
diff
changeset
|
1442 int i; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1443 int last_pos, bits_left; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1444 VLC *vlc; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1445 int end_pos= FFMIN(end_pos2, s->gb.size_in_bits); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1446 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1447 /* low frequencies (called big values) */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1448 s_index = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1449 for(i=0;i<3;i++) { |
|
3626
a6251ee2dfdb
move variable declarations so that their scope is smaller
michael
parents:
3625
diff
changeset
|
1450 int j, k, l, linbits; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1451 j = g->region_size[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1452 if (j == 0) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1453 continue; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1454 /* select vlc table */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1455 k = g->table_select[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1456 l = mpa_huff_data[k][0]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1457 linbits = mpa_huff_data[k][1]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1458 vlc = &huff_vlc[l]; |
| 0 | 1459 |
| 3609 | 1460 if(!l){ |
|
3636
031252e99956
another silly typo which surprisingly neither valgrind nor cmp of the file output cought
michael
parents:
3635
diff
changeset
|
1461 memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*2*j); |
| 3609 | 1462 s_index += 2*j; |
| 1463 continue; | |
| 1464 } | |
| 1465 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1466 /* read huffcode and compute each couple */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1467 for(;j>0;j--) { |
| 11707 | 1468 int exponent, x, y; |
|
11711
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1469 int v; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1470 int pos= get_bits_count(&s->gb); |
| 3624 | 1471 |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1472 if (pos >= end_pos){ |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1473 // av_log(NULL, AV_LOG_ERROR, "pos: %d %d %d %d\n", pos, end_pos, end_pos2, s_index); |
| 4469 | 1474 switch_buffer(s, &pos, &end_pos, &end_pos2); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1475 // av_log(NULL, AV_LOG_ERROR, "new pos: %d %d\n", pos, end_pos); |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1476 if(pos >= end_pos) |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1477 break; |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1478 } |
|
3623
d0242f36a793
reduce size of vlc table, thats slightly faster here
michael
parents:
3622
diff
changeset
|
1479 y = get_vlc2(&s->gb, vlc->table, 7, 3); |
|
3611
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1480 |
|
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1481 if(!y){ |
|
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1482 g->sb_hybrid[s_index ] = |
|
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1483 g->sb_hybrid[s_index+1] = 0; |
|
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1484 s_index += 2; |
|
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1485 continue; |
|
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1486 } |
|
a20d179c79c3
faster handling of zero coeffs in the low freq decode
michael
parents:
3610
diff
changeset
|
1487 |
| 3624 | 1488 exponent= exponents[s_index]; |
| 3609 | 1489 |
| 4652 | 1490 dprintf(s->avctx, "region=%d n=%d x=%d y=%d exp=%d\n", |
| 3624 | 1491 i, g->region_size[i] - j, x, y, exponent); |
| 3627 | 1492 if(y&16){ |
| 1493 x = y >> 5; | |
| 1494 y = y & 0x0f; | |
| 3622 | 1495 if (x < 15){ |
|
11711
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1496 READ_FLIP_SIGN(g->sb_hybrid+s_index, RENAME(expval_table)[ exponent ]+x) |
| 3622 | 1497 }else{ |
| 1498 x += get_bitsz(&s->gb, linbits); | |
| 3624 | 1499 v = l3_unscale(x, exponent); |
|
11711
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1500 if (get_bits1(&s->gb)) |
|
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1501 v = -v; |
|
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1502 g->sb_hybrid[s_index] = v; |
| 3622 | 1503 } |
| 1504 if (y < 15){ | |
|
11711
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1505 READ_FLIP_SIGN(g->sb_hybrid+s_index+1, RENAME(expval_table)[ exponent ]+y) |
| 3622 | 1506 }else{ |
| 1507 y += get_bitsz(&s->gb, linbits); | |
| 3624 | 1508 v = l3_unscale(y, exponent); |
|
11711
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1509 if (get_bits1(&s->gb)) |
|
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1510 v = -v; |
|
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1511 g->sb_hybrid[s_index+1] = v; |
| 3622 | 1512 } |
| 3627 | 1513 }else{ |
| 1514 x = y >> 5; | |
| 1515 y = y & 0x0f; | |
| 1516 x += y; | |
| 1517 if (x < 15){ | |
|
11711
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1518 READ_FLIP_SIGN(g->sb_hybrid+s_index+!!y, RENAME(expval_table)[ exponent ]+x) |
| 3627 | 1519 }else{ |
| 1520 x += get_bitsz(&s->gb, linbits); | |
| 1521 v = l3_unscale(x, exponent); | |
|
11711
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1522 if (get_bits1(&s->gb)) |
|
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1523 v = -v; |
|
7ca3795af11b
Do the same sign flip optimization to the low freq decoder.
michael
parents:
11710
diff
changeset
|
1524 g->sb_hybrid[s_index+!!y] = v; |
| 3627 | 1525 } |
| 3635 | 1526 g->sb_hybrid[s_index+ !y] = 0; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1527 } |
| 3627 | 1528 s_index+=2; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1529 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1530 } |
| 2967 | 1531 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1532 /* high frequencies */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1533 vlc = &huff_quad_vlc[g->count1table_select]; |
| 3612 | 1534 last_pos=0; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1535 while (s_index <= 572) { |
|
3626
a6251ee2dfdb
move variable declarations so that their scope is smaller
michael
parents:
3625
diff
changeset
|
1536 int pos, code; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1537 pos = get_bits_count(&s->gb); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1538 if (pos >= end_pos) { |
| 3647 | 1539 if (pos > end_pos2 && last_pos){ |
| 1540 /* some encoders generate an incorrect size for this | |
| 1541 part. We must go back into the data */ | |
| 1542 s_index -= 4; | |
| 1543 skip_bits_long(&s->gb, last_pos - pos); | |
|
7329
104a00d9abfa
Supply context argument to av_log() in mpeg audio decoder.
andoma
parents:
7256
diff
changeset
|
1544 av_log(s->avctx, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos); |
| 7831 | 1545 if(s->error_recognition >= FF_ER_COMPLIANT) |
|
4205
8c28f03cfdd5
detect a few more errors (fixes libmp3-bug.avi again)
michael
parents:
4204
diff
changeset
|
1546 s_index=0; |
| 3647 | 1547 break; |
| 1548 } | |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1549 // av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index); |
| 4469 | 1550 switch_buffer(s, &pos, &end_pos, &end_pos2); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1551 // av_log(NULL, AV_LOG_ERROR, "new pos2: %d %d %d\n", pos, end_pos, s_index); |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1552 if(pos >= end_pos) |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1553 break; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1554 } |
| 3612 | 1555 last_pos= pos; |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
468
diff
changeset
|
1556 |
| 3610 | 1557 code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1); |
| 4652 | 1558 dprintf(s->avctx, "t=%d code=%d\n", g->count1table_select, code); |
| 3610 | 1559 g->sb_hybrid[s_index+0]= |
| 1560 g->sb_hybrid[s_index+1]= | |
| 1561 g->sb_hybrid[s_index+2]= | |
| 1562 g->sb_hybrid[s_index+3]= 0; | |
| 1563 while(code){ | |
|
4908
777f250df232
Fix multiple "?inline/static? is not at beginning of declaration" warnings.
diego
parents:
4796
diff
changeset
|
1564 static const int idxtab[16]={3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0}; |
| 11709 | 1565 int v; |
| 3610 | 1566 int pos= s_index+idxtab[code]; |
| 1567 code ^= 8>>idxtab[code]; | |
| 11710 | 1568 READ_FLIP_SIGN(g->sb_hybrid+pos, RENAME(exp_table)+exponents[pos]) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1569 } |
| 3610 | 1570 s_index+=4; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1571 } |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1572 /* skip extension bits */ |
| 4468 | 1573 bits_left = end_pos2 - get_bits_count(&s->gb); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1574 //av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer); |
|
7867
2a611af7bcbe
Make decoder more robust by default against broken encoders.
michael
parents:
7831
diff
changeset
|
1575 if (bits_left < 0 && s->error_recognition >= FF_ER_COMPLIANT) { |
|
7329
104a00d9abfa
Supply context argument to av_log() in mpeg audio decoder.
andoma
parents:
7256
diff
changeset
|
1576 av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left); |
|
4205
8c28f03cfdd5
detect a few more errors (fixes libmp3-bug.avi again)
michael
parents:
4204
diff
changeset
|
1577 s_index=0; |
| 7831 | 1578 }else if(bits_left > 0 && s->error_recognition >= FF_ER_AGGRESSIVE){ |
|
7329
104a00d9abfa
Supply context argument to av_log() in mpeg audio decoder.
andoma
parents:
7256
diff
changeset
|
1579 av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left); |
|
4205
8c28f03cfdd5
detect a few more errors (fixes libmp3-bug.avi again)
michael
parents:
4204
diff
changeset
|
1580 s_index=0; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1581 } |
|
4205
8c28f03cfdd5
detect a few more errors (fixes libmp3-bug.avi again)
michael
parents:
4204
diff
changeset
|
1582 memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index)); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1583 skip_bits_long(&s->gb, bits_left); |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1584 |
| 4468 | 1585 i= get_bits_count(&s->gb); |
| 4469 | 1586 switch_buffer(s, &i, &end_pos, &end_pos2); |
| 4468 | 1587 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1588 return 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1589 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1590 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1591 /* Reorder short blocks from bitstream order to interleaved order. It |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1592 would be faster to do it in parsing, but the code would be far more |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1593 complicated */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1594 static void reorder_block(MPADecodeContext *s, GranuleDef *g) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1595 { |
|
3614
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1596 int i, j, len; |
| 11707 | 1597 INTFLOAT *ptr, *dst, *ptr1; |
| 1598 INTFLOAT tmp[576]; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1599 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1600 if (g->block_type != 2) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1601 return; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1602 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1603 if (g->switch_point) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1604 if (s->sample_rate_index != 8) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1605 ptr = g->sb_hybrid + 36; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1606 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1607 ptr = g->sb_hybrid + 48; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1608 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1609 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1610 ptr = g->sb_hybrid; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1611 } |
| 2967 | 1612 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1613 for(i=g->short_start;i<13;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1614 len = band_size_short[s->sample_rate_index][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1615 ptr1 = ptr; |
|
3614
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1616 dst = tmp; |
|
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1617 for(j=len;j>0;j--) { |
|
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1618 *dst++ = ptr[0*len]; |
|
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1619 *dst++ = ptr[1*len]; |
|
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1620 *dst++ = ptr[2*len]; |
|
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1621 ptr++; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1622 } |
|
3614
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1623 ptr+=2*len; |
|
d0310d1cce13
optimize reorder_block() though this function seems to be executed too rarely for this to make much difference
michael
parents:
3613
diff
changeset
|
1624 memcpy(ptr1, tmp, len * 3 * sizeof(*ptr1)); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1625 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1626 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1627 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1628 #define ISQRT2 FIXR(0.70710678118654752440) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1629 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1630 static void compute_stereo(MPADecodeContext *s, |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1631 GranuleDef *g0, GranuleDef *g1) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1632 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1633 int i, j, k, l; |
| 11707 | 1634 int sf_max, sf, len, non_zero_found; |
| 1635 INTFLOAT (*is_tab)[16], *tab0, *tab1, tmp0, tmp1, v1, v2; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1636 int non_zero_found_short[3]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1637 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1638 /* intensity stereo */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1639 if (s->mode_ext & MODE_EXT_I_STEREO) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1640 if (!s->lsf) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1641 is_tab = is_table; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1642 sf_max = 7; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1643 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1644 is_tab = is_table_lsf[g1->scalefac_compress & 1]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1645 sf_max = 16; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1646 } |
| 2967 | 1647 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1648 tab0 = g0->sb_hybrid + 576; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1649 tab1 = g1->sb_hybrid + 576; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1650 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1651 non_zero_found_short[0] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1652 non_zero_found_short[1] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1653 non_zero_found_short[2] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1654 k = (13 - g1->short_start) * 3 + g1->long_end - 3; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1655 for(i = 12;i >= g1->short_start;i--) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1656 /* for last band, use previous scale factor */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1657 if (i != 11) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1658 k -= 3; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1659 len = band_size_short[s->sample_rate_index][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1660 for(l=2;l>=0;l--) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1661 tab0 -= len; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1662 tab1 -= len; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1663 if (!non_zero_found_short[l]) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1664 /* test if non zero band. if so, stop doing i-stereo */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1665 for(j=0;j<len;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1666 if (tab1[j] != 0) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1667 non_zero_found_short[l] = 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1668 goto found1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1669 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1670 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1671 sf = g1->scale_factors[k + l]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1672 if (sf >= sf_max) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1673 goto found1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1674 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1675 v1 = is_tab[0][sf]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1676 v2 = is_tab[1][sf]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1677 for(j=0;j<len;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1678 tmp0 = tab0[j]; |
| 11707 | 1679 tab0[j] = MULLx(tmp0, v1, FRAC_BITS); |
| 1680 tab1[j] = MULLx(tmp0, v2, FRAC_BITS); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1681 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1682 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1683 found1: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1684 if (s->mode_ext & MODE_EXT_MS_STEREO) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1685 /* lower part of the spectrum : do ms stereo |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1686 if enabled */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1687 for(j=0;j<len;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1688 tmp0 = tab0[j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1689 tmp1 = tab1[j]; |
| 11707 | 1690 tab0[j] = MULLx(tmp0 + tmp1, ISQRT2, FRAC_BITS); |
| 1691 tab1[j] = MULLx(tmp0 - tmp1, ISQRT2, FRAC_BITS); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1692 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1693 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1694 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1695 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1696 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1697 |
| 2967 | 1698 non_zero_found = non_zero_found_short[0] | |
| 1699 non_zero_found_short[1] | | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1700 non_zero_found_short[2]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1701 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1702 for(i = g1->long_end - 1;i >= 0;i--) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1703 len = band_size_long[s->sample_rate_index][i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1704 tab0 -= len; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1705 tab1 -= len; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1706 /* test if non zero band. if so, stop doing i-stereo */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1707 if (!non_zero_found) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1708 for(j=0;j<len;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1709 if (tab1[j] != 0) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1710 non_zero_found = 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1711 goto found2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1712 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1713 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1714 /* for last band, use previous scale factor */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1715 k = (i == 21) ? 20 : i; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1716 sf = g1->scale_factors[k]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1717 if (sf >= sf_max) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1718 goto found2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1719 v1 = is_tab[0][sf]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1720 v2 = is_tab[1][sf]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1721 for(j=0;j<len;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1722 tmp0 = tab0[j]; |
| 11707 | 1723 tab0[j] = MULLx(tmp0, v1, FRAC_BITS); |
| 1724 tab1[j] = MULLx(tmp0, v2, FRAC_BITS); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1725 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1726 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1727 found2: |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1728 if (s->mode_ext & MODE_EXT_MS_STEREO) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1729 /* lower part of the spectrum : do ms stereo |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1730 if enabled */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1731 for(j=0;j<len;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1732 tmp0 = tab0[j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1733 tmp1 = tab1[j]; |
| 11707 | 1734 tab0[j] = MULLx(tmp0 + tmp1, ISQRT2, FRAC_BITS); |
| 1735 tab1[j] = MULLx(tmp0 - tmp1, ISQRT2, FRAC_BITS); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1736 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1737 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1738 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1739 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1740 } else if (s->mode_ext & MODE_EXT_MS_STEREO) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1741 /* ms stereo ONLY */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1742 /* NOTE: the 1/sqrt(2) normalization factor is included in the |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1743 global gain */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1744 tab0 = g0->sb_hybrid; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1745 tab1 = g1->sb_hybrid; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1746 for(i=0;i<576;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1747 tmp0 = tab0[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1748 tmp1 = tab1[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1749 tab0[i] = tmp0 + tmp1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1750 tab1[i] = tmp0 - tmp1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1751 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1752 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1753 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1754 |
|
1733
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1755 static void compute_antialias_integer(MPADecodeContext *s, |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1756 GranuleDef *g) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1757 { |
| 2491 | 1758 int32_t *ptr, *csa; |
| 1759 int n, i; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1760 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1761 /* we antialias only "long" bands */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1762 if (g->block_type == 2) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1763 if (!g->switch_point) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1764 return; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1765 /* XXX: check this for 8000Hz case */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1766 n = 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1767 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1768 n = SBLIMIT - 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1769 } |
| 2967 | 1770 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1771 ptr = g->sb_hybrid + 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1772 for(i = n;i > 0;i--) { |
| 2491 | 1773 int tmp0, tmp1, tmp2; |
| 1774 csa = &csa_table[0][0]; | |
| 1775 #define INT_AA(j) \ | |
|
2496
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1776 tmp0 = ptr[-1-j];\ |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1777 tmp1 = ptr[ j];\ |
| 2491 | 1778 tmp2= MULH(tmp0 + tmp1, csa[0+4*j]);\ |
|
2496
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1779 ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa[2+4*j]));\ |
|
74d7fd7b49c5
merge a few shifts into the dequantization, faster and more accurate, lets hope it doesnt overflow
michael
parents:
2495
diff
changeset
|
1780 ptr[ j] = 4*(tmp2 + MULH(tmp0, csa[3+4*j])); |
| 2491 | 1781 |
| 1782 INT_AA(0) | |
| 1783 INT_AA(1) | |
| 1784 INT_AA(2) | |
| 1785 INT_AA(3) | |
| 1786 INT_AA(4) | |
| 1787 INT_AA(5) | |
| 1788 INT_AA(6) | |
| 1789 INT_AA(7) | |
| 2967 | 1790 |
| 1791 ptr += 18; | |
|
1733
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1792 } |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1793 } |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1794 |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1795 static void compute_antialias_float(MPADecodeContext *s, |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1796 GranuleDef *g) |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1797 { |
| 11707 | 1798 float *ptr; |
| 2491 | 1799 int n, i; |
|
1733
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1800 |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1801 /* we antialias only "long" bands */ |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1802 if (g->block_type == 2) { |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1803 if (!g->switch_point) |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1804 return; |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1805 /* XXX: check this for 8000Hz case */ |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1806 n = 1; |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1807 } else { |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1808 n = SBLIMIT - 1; |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1809 } |
| 2967 | 1810 |
|
1733
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1811 ptr = g->sb_hybrid + 18; |
|
b47d56b1a049
optimize compute_antialias() and add a floating point based alternative (2x faster)
michael
parents:
1612
diff
changeset
|
1812 for(i = n;i > 0;i--) { |
| 2491 | 1813 float tmp0, tmp1; |
| 2967 | 1814 float *csa = &csa_table_float[0][0]; |
| 2491 | 1815 #define FLOAT_AA(j)\ |
| 1816 tmp0= ptr[-1-j];\ | |
| 1817 tmp1= ptr[ j];\ | |
| 11707 | 1818 ptr[-1-j] = tmp0 * csa[0+4*j] - tmp1 * csa[1+4*j];\ |
| 1819 ptr[ j] = tmp0 * csa[1+4*j] + tmp1 * csa[0+4*j]; | |
| 2967 | 1820 |
| 2491 | 1821 FLOAT_AA(0) |
| 1822 FLOAT_AA(1) | |
| 1823 FLOAT_AA(2) | |
| 1824 FLOAT_AA(3) | |
| 1825 FLOAT_AA(4) | |
| 1826 FLOAT_AA(5) | |
| 1827 FLOAT_AA(6) | |
| 1828 FLOAT_AA(7) | |
| 1829 | |
| 2967 | 1830 ptr += 18; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1831 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1832 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1833 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1834 static void compute_imdct(MPADecodeContext *s, |
| 2967 | 1835 GranuleDef *g, |
| 11707 | 1836 INTFLOAT *sb_samples, |
| 1837 INTFLOAT *mdct_buf) | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1838 { |
| 11707 | 1839 INTFLOAT *win, *win1, *out_ptr, *ptr, *buf, *ptr1; |
| 1840 INTFLOAT out2[12]; | |
| 1841 int i, j, mdct_long_end, sblimit; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1842 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1843 /* find last non zero block */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1844 ptr = g->sb_hybrid + 576; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1845 ptr1 = g->sb_hybrid + 2 * 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1846 while (ptr >= ptr1) { |
| 11707 | 1847 int32_t *p; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1848 ptr -= 6; |
| 11707 | 1849 p= (int32_t*)ptr; |
| 1850 if(p[0] | p[1] | p[2] | p[3] | p[4] | p[5]) | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1851 break; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1852 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1853 sblimit = ((ptr - g->sb_hybrid) / 18) + 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1854 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1855 if (g->block_type == 2) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1856 /* XXX: check for 8000 Hz */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1857 if (g->switch_point) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1858 mdct_long_end = 2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1859 else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1860 mdct_long_end = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1861 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1862 mdct_long_end = sblimit; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1863 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1864 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1865 buf = mdct_buf; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1866 ptr = g->sb_hybrid; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1867 for(j=0;j<mdct_long_end;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1868 /* apply window & overlap with previous buffer */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1869 out_ptr = sb_samples + j; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1870 /* select window */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1871 if (g->switch_point && j < 2) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1872 win1 = mdct_win[0]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1873 else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1874 win1 = mdct_win[g->block_type]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1875 /* select frequency inversion */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1876 win = win1 + ((4 * 36) & -(j & 1)); |
| 2489 | 1877 imdct36(out_ptr, buf, ptr, win); |
| 1878 out_ptr += 18*SBLIMIT; | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1879 ptr += 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1880 buf += 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1881 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1882 for(j=mdct_long_end;j<sblimit;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1883 /* select frequency inversion */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1884 win = mdct_win[2] + ((4 * 36) & -(j & 1)); |
| 2495 | 1885 out_ptr = sb_samples + j; |
| 2967 | 1886 |
| 2495 | 1887 for(i=0; i<6; i++){ |
| 1888 *out_ptr = buf[i]; | |
| 1889 out_ptr += SBLIMIT; | |
| 1890 } | |
| 1891 imdct12(out2, ptr + 0); | |
| 1892 for(i=0;i<6;i++) { | |
| 11707 | 1893 *out_ptr = MULH3(out2[i ], win[i ], 1) + buf[i + 6*1]; |
| 1894 buf[i + 6*2] = MULH3(out2[i + 6], win[i + 6], 1); | |
| 2495 | 1895 out_ptr += SBLIMIT; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1896 } |
| 2495 | 1897 imdct12(out2, ptr + 1); |
| 1898 for(i=0;i<6;i++) { | |
| 11707 | 1899 *out_ptr = MULH3(out2[i ], win[i ], 1) + buf[i + 6*2]; |
| 1900 buf[i + 6*0] = MULH3(out2[i + 6], win[i + 6], 1); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1901 out_ptr += SBLIMIT; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1902 } |
| 2495 | 1903 imdct12(out2, ptr + 2); |
| 1904 for(i=0;i<6;i++) { | |
| 11707 | 1905 buf[i + 6*0] = MULH3(out2[i ], win[i ], 1) + buf[i + 6*0]; |
| 1906 buf[i + 6*1] = MULH3(out2[i + 6], win[i + 6], 1); | |
| 2495 | 1907 buf[i + 6*2] = 0; |
| 1908 } | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1909 ptr += 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1910 buf += 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1911 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1912 /* zero bands */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1913 for(j=sblimit;j<SBLIMIT;j++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1914 /* overlap */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1915 out_ptr = sb_samples + j; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1916 for(i=0;i<18;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1917 *out_ptr = buf[i]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1918 buf[i] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1919 out_ptr += SBLIMIT; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1920 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1921 buf += 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1922 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1923 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1924 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1925 /* main layer3 decoding function */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1926 static int mp_decode_layer3(MPADecodeContext *s) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1927 { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1928 int nb_granules, main_data_begin, private_bits; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
1929 int gr, ch, blocksplit_flag, i, j, k, n, bits_pos; |
| 10494 | 1930 GranuleDef *g; |
| 11707 | 1931 int16_t exponents[576]; //FIXME try INTFLOAT |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1932 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1933 /* read side info */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1934 if (s->lsf) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1935 main_data_begin = get_bits(&s->gb, 8); |
| 3613 | 1936 private_bits = get_bits(&s->gb, s->nb_channels); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1937 nb_granules = 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1938 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1939 main_data_begin = get_bits(&s->gb, 9); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1940 if (s->nb_channels == 2) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1941 private_bits = get_bits(&s->gb, 3); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1942 else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1943 private_bits = get_bits(&s->gb, 5); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1944 nb_granules = 2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1945 for(ch=0;ch<s->nb_channels;ch++) { |
| 10494 | 1946 s->granules[ch][0].scfsi = 0;/* all scale factors are transmitted */ |
| 1947 s->granules[ch][1].scfsi = get_bits(&s->gb, 4); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1948 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1949 } |
| 2967 | 1950 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1951 for(gr=0;gr<nb_granules;gr++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1952 for(ch=0;ch<s->nb_channels;ch++) { |
| 4652 | 1953 dprintf(s->avctx, "gr=%d ch=%d: side_info\n", gr, ch); |
| 10494 | 1954 g = &s->granules[ch][gr]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1955 g->part2_3_length = get_bits(&s->gb, 12); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1956 g->big_values = get_bits(&s->gb, 9); |
| 4202 | 1957 if(g->big_values > 288){ |
| 4652 | 1958 av_log(s->avctx, AV_LOG_ERROR, "big_values too big\n"); |
| 4202 | 1959 return -1; |
| 1960 } | |
| 1961 | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1962 g->global_gain = get_bits(&s->gb, 8); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1963 /* if MS stereo only is selected, we precompute the |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1964 1/sqrt(2) renormalization factor */ |
| 2967 | 1965 if ((s->mode_ext & (MODE_EXT_MS_STEREO | MODE_EXT_I_STEREO)) == |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1966 MODE_EXT_MS_STEREO) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1967 g->global_gain -= 2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1968 if (s->lsf) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1969 g->scalefac_compress = get_bits(&s->gb, 9); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1970 else |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1971 g->scalefac_compress = get_bits(&s->gb, 4); |
| 5513 | 1972 blocksplit_flag = get_bits1(&s->gb); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1973 if (blocksplit_flag) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1974 g->block_type = get_bits(&s->gb, 2); |
| 4202 | 1975 if (g->block_type == 0){ |
|
7329
104a00d9abfa
Supply context argument to av_log() in mpeg audio decoder.
andoma
parents:
7256
diff
changeset
|
1976 av_log(s->avctx, AV_LOG_ERROR, "invalid block type\n"); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1977 return -1; |
| 4202 | 1978 } |
| 5513 | 1979 g->switch_point = get_bits1(&s->gb); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1980 for(i=0;i<2;i++) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1981 g->table_select[i] = get_bits(&s->gb, 5); |
| 2967 | 1982 for(i=0;i<3;i++) |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1983 g->subblock_gain[i] = get_bits(&s->gb, 3); |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
1984 ff_init_short_region(s, g); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1985 } else { |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
1986 int region_address1, region_address2; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1987 g->block_type = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1988 g->switch_point = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1989 for(i=0;i<3;i++) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1990 g->table_select[i] = get_bits(&s->gb, 5); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1991 /* compute huffman coded region sizes */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1992 region_address1 = get_bits(&s->gb, 4); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1993 region_address2 = get_bits(&s->gb, 3); |
| 4652 | 1994 dprintf(s->avctx, "region1=%d region2=%d\n", |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1995 region_address1, region_address2); |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
1996 ff_init_long_region(s, g, region_address1, region_address2); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
1997 } |
|
6138
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
1998 ff_region_offset2size(g); |
|
c7a61f83de73
Factorize some code into functions, had this in my tree and will be
michael
parents:
6137
diff
changeset
|
1999 ff_compute_band_indexes(s, g); |
| 2967 | 2000 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2001 g->preflag = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2002 if (!s->lsf) |
| 5513 | 2003 g->preflag = get_bits1(&s->gb); |
| 2004 g->scalefac_scale = get_bits1(&s->gb); | |
| 2005 g->count1table_select = get_bits1(&s->gb); | |
| 4652 | 2006 dprintf(s->avctx, "block_type=%d switch_point=%d\n", |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2007 g->block_type, g->switch_point); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2008 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2009 } |
| 0 | 2010 |
| 2432 | 2011 if (!s->adu_mode) { |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2012 const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3); |
| 3647 | 2013 assert((get_bits_count(&s->gb) & 7) == 0); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2014 /* now we get bits from the main_data_begin offset */ |
| 4652 | 2015 dprintf(s->avctx, "seekback: %d\n", main_data_begin); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2016 //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size); |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2017 |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2018 memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES); |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2019 s->in_gb= s->gb; |
| 4204 | 2020 init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8); |
| 2021 skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin)); | |
| 2432 | 2022 } |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2023 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2024 for(gr=0;gr<nb_granules;gr++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2025 for(ch=0;ch<s->nb_channels;ch++) { |
| 10494 | 2026 g = &s->granules[ch][gr]; |
| 4204 | 2027 if(get_bits_count(&s->gb)<0){ |
|
10125
67b0747c4192
Reduce pointless verbosity after seeks in the MP3 decoder.
diego
parents:
9896
diff
changeset
|
2028 av_log(s->avctx, AV_LOG_DEBUG, "mdb:%d, lastbuf:%d skipping granule %d\n", |
| 4204 | 2029 main_data_begin, s->last_buf_size, gr); |
| 2030 skip_bits_long(&s->gb, g->part2_3_length); | |
| 2031 memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid)); | |
| 2032 if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer){ | |
| 2033 skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits); | |
| 2034 s->gb= s->in_gb; | |
| 2035 s->in_gb.buffer=NULL; | |
| 2036 } | |
| 2037 continue; | |
| 2038 } | |
| 2967 | 2039 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2040 bits_pos = get_bits_count(&s->gb); |
| 2967 | 2041 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2042 if (!s->lsf) { |
| 1064 | 2043 uint8_t *sc; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2044 int slen, slen1, slen2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2045 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2046 /* MPEG1 scale factors */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2047 slen1 = slen_table[0][g->scalefac_compress]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2048 slen2 = slen_table[1][g->scalefac_compress]; |
| 4652 | 2049 dprintf(s->avctx, "slen1=%d slen2=%d\n", slen1, slen2); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2050 if (g->block_type == 2) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2051 n = g->switch_point ? 17 : 18; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2052 j = 0; |
| 3616 | 2053 if(slen1){ |
| 2054 for(i=0;i<n;i++) | |
| 2055 g->scale_factors[j++] = get_bits(&s->gb, slen1); | |
| 2056 }else{ | |
| 2057 for(i=0;i<n;i++) | |
| 2058 g->scale_factors[j++] = 0; | |
| 2059 } | |
| 2060 if(slen2){ | |
| 2061 for(i=0;i<18;i++) | |
| 2062 g->scale_factors[j++] = get_bits(&s->gb, slen2); | |
| 2063 for(i=0;i<3;i++) | |
| 2064 g->scale_factors[j++] = 0; | |
| 2065 }else{ | |
| 2066 for(i=0;i<21;i++) | |
| 2067 g->scale_factors[j++] = 0; | |
| 2068 } | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2069 } else { |
| 10494 | 2070 sc = s->granules[ch][0].scale_factors; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2071 j = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2072 for(k=0;k<4;k++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2073 n = (k == 0 ? 6 : 5); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2074 if ((g->scfsi & (0x8 >> k)) == 0) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2075 slen = (k < 2) ? slen1 : slen2; |
| 3616 | 2076 if(slen){ |
| 2077 for(i=0;i<n;i++) | |
| 2078 g->scale_factors[j++] = get_bits(&s->gb, slen); | |
| 2079 }else{ | |
| 2080 for(i=0;i<n;i++) | |
| 2081 g->scale_factors[j++] = 0; | |
| 2082 } | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2083 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2084 /* simply copy from last granule */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2085 for(i=0;i<n;i++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2086 g->scale_factors[j] = sc[j]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2087 j++; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2088 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2089 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2090 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2091 g->scale_factors[j++] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2092 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2093 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2094 int tindex, tindex2, slen[4], sl, sf; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2095 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2096 /* LSF scale factors */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2097 if (g->block_type == 2) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2098 tindex = g->switch_point ? 2 : 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2099 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2100 tindex = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2101 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2102 sf = g->scalefac_compress; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2103 if ((s->mode_ext & MODE_EXT_I_STEREO) && ch == 1) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2104 /* intensity stereo case */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2105 sf >>= 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2106 if (sf < 180) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2107 lsf_sf_expand(slen, sf, 6, 6, 0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2108 tindex2 = 3; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2109 } else if (sf < 244) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2110 lsf_sf_expand(slen, sf - 180, 4, 4, 0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2111 tindex2 = 4; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2112 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2113 lsf_sf_expand(slen, sf - 244, 3, 0, 0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2114 tindex2 = 5; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2115 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2116 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2117 /* normal case */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2118 if (sf < 400) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2119 lsf_sf_expand(slen, sf, 5, 4, 4); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2120 tindex2 = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2121 } else if (sf < 500) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2122 lsf_sf_expand(slen, sf - 400, 5, 4, 0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2123 tindex2 = 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2124 } else { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2125 lsf_sf_expand(slen, sf - 500, 3, 0, 0); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2126 tindex2 = 2; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2127 g->preflag = 1; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2128 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2129 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2130 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2131 j = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2132 for(k=0;k<4;k++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2133 n = lsf_nsf_table[tindex2][tindex][k]; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2134 sl = slen[k]; |
| 3617 | 2135 if(sl){ |
| 3616 | 2136 for(i=0;i<n;i++) |
| 2137 g->scale_factors[j++] = get_bits(&s->gb, sl); | |
| 2138 }else{ | |
| 2139 for(i=0;i<n;i++) | |
| 2140 g->scale_factors[j++] = 0; | |
| 2141 } | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2142 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2143 /* XXX: should compute exact size */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2144 for(;j<40;j++) |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2145 g->scale_factors[j] = 0; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2146 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2147 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2148 exponents_from_scale_factors(s, g, exponents); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2149 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2150 /* read Huffman coded residue */ |
| 4204 | 2151 huffman_decode(s, g, exponents, bits_pos + g->part2_3_length); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2152 } /* ch */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2153 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2154 if (s->nb_channels == 2) |
| 10494 | 2155 compute_stereo(s, &s->granules[0][gr], &s->granules[1][gr]); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2156 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2157 for(ch=0;ch<s->nb_channels;ch++) { |
| 10494 | 2158 g = &s->granules[ch][gr]; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2159 |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2160 reorder_block(s, g); |
| 11707 | 2161 compute_antialias(s, g); |
| 2967 | 2162 compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]); |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2163 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2164 } /* gr */ |
| 4204 | 2165 if(get_bits_count(&s->gb)<0) |
| 2166 skip_bits_long(&s->gb, -get_bits_count(&s->gb)); | |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2167 return nb_granules * 18; |
| 0 | 2168 } |
| 2169 | |
| 2967 | 2170 static int mp_decode_frame(MPADecodeContext *s, |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2171 OUT_INT *samples, const uint8_t *buf, int buf_size) |
| 0 | 2172 { |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2173 int i, nb_frames, ch; |
| 2479 | 2174 OUT_INT *samples_ptr; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2175 |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2176 init_get_bits(&s->gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE)*8); |
| 2967 | 2177 |
| 0 | 2178 /* skip error protection field */ |
| 2179 if (s->error_protection) | |
| 5518 | 2180 skip_bits(&s->gb, 16); |
| 0 | 2181 |
| 4652 | 2182 dprintf(s->avctx, "frame %d:\n", s->frame_count); |
| 0 | 2183 switch(s->layer) { |
| 2184 case 1: | |
| 6511 | 2185 s->avctx->frame_size = 384; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2186 nb_frames = mp_decode_layer1(s); |
| 0 | 2187 break; |
| 2188 case 2: | |
| 6511 | 2189 s->avctx->frame_size = 1152; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2190 nb_frames = mp_decode_layer2(s); |
| 0 | 2191 break; |
| 2192 case 3: | |
| 6511 | 2193 s->avctx->frame_size = s->lsf ? 576 : 1152; |
| 0 | 2194 default: |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2195 nb_frames = mp_decode_layer3(s); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2196 |
| 3643 | 2197 s->last_buf_size=0; |
| 2198 if(s->in_gb.buffer){ | |
| 2199 align_get_bits(&s->gb); | |
|
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
10494
diff
changeset
|
2200 i= get_bits_left(&s->gb)>>3; |
| 3647 | 2201 if(i >= 0 && i <= BACKSTEP_SIZE){ |
| 3643 | 2202 memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i); |
| 2203 s->last_buf_size=i; | |
| 3647 | 2204 }else |
|
7329
104a00d9abfa
Supply context argument to av_log() in mpeg audio decoder.
andoma
parents:
7256
diff
changeset
|
2205 av_log(s->avctx, AV_LOG_ERROR, "invalid old backstep %d\n", i); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2206 s->gb= s->in_gb; |
| 4204 | 2207 s->in_gb.buffer= NULL; |
| 3643 | 2208 } |
| 2209 | |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2210 align_get_bits(&s->gb); |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2211 assert((get_bits_count(&s->gb) & 7) == 0); |
|
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
10494
diff
changeset
|
2212 i= get_bits_left(&s->gb)>>3; |
| 3643 | 2213 |
| 3647 | 2214 if(i<0 || i > BACKSTEP_SIZE || nb_frames<0){ |
|
7870
08ef30f08a01
Only print "invalid new backstep" when it is really invalid.
michael
parents:
7867
diff
changeset
|
2215 if(i<0) |
|
08ef30f08a01
Only print "invalid new backstep" when it is really invalid.
michael
parents:
7867
diff
changeset
|
2216 av_log(s->avctx, AV_LOG_ERROR, "invalid new backstep %d\n", i); |
| 3647 | 2217 i= FFMIN(BACKSTEP_SIZE, buf_size - HEADER_SIZE); |
| 2218 } | |
| 3643 | 2219 assert(i <= buf_size - HEADER_SIZE && i>= 0); |
| 3647 | 2220 memcpy(s->last_buf + s->last_buf_size, s->gb.buffer + buf_size - HEADER_SIZE - i, i); |
| 3643 | 2221 s->last_buf_size += i; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2222 |
| 0 | 2223 break; |
| 2224 } | |
|
7763
73b10d25cb8d
Remove debuging junk that probably hasnt been used by anyone since years.
michael
parents:
7452
diff
changeset
|
2225 |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2226 /* apply the synthesis filter */ |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2227 for(ch=0;ch<s->nb_channels;ch++) { |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2228 samples_ptr = samples + ch; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2229 for(i=0;i<nb_frames;i++) { |
| 11707 | 2230 RENAME(ff_mpa_synth_filter)(s->synth_buf[ch], &(s->synth_buf_offset[ch]), |
| 2231 RENAME(ff_mpa_synth_window), &s->dither_state, | |
| 2979 | 2232 samples_ptr, s->nb_channels, |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2233 s->sb_samples[ch][i]); |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2234 samples_ptr += 32 * s->nb_channels; |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2235 } |
|
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2236 } |
|
7763
73b10d25cb8d
Remove debuging junk that probably hasnt been used by anyone since years.
michael
parents:
7452
diff
changeset
|
2237 |
| 2479 | 2238 return nb_frames * 32 * sizeof(OUT_INT) * s->nb_channels; |
| 0 | 2239 } |
| 2240 | |
| 2241 static int decode_frame(AVCodecContext * avctx, | |
| 2979 | 2242 void *data, int *data_size, |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2243 AVPacket *avpkt) |
| 0 | 2244 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2245 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2246 int buf_size = avpkt->size; |
| 0 | 2247 MPADecodeContext *s = avctx->priv_data; |
| 1064 | 2248 uint32_t header; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2249 int out_size; |
| 2479 | 2250 OUT_INT *out_samples = data; |
| 0 | 2251 |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2252 if(buf_size < HEADER_SIZE) |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2253 return -1; |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2254 |
| 5089 | 2255 header = AV_RB32(buf); |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2256 if(ff_mpa_check_header(header) < 0){ |
|
9896
bbefbca72722
Drop code that attempts to decode frames that are prefixed by junk.
michael
parents:
9603
diff
changeset
|
2257 av_log(avctx, AV_LOG_ERROR, "Header missing\n"); |
|
bbefbca72722
Drop code that attempts to decode frames that are prefixed by junk.
michael
parents:
9603
diff
changeset
|
2258 return -1; |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2259 } |
| 143 | 2260 |
| 8641 | 2261 if (ff_mpegaudio_decode_header((MPADecodeHeader *)s, header) == 1) { |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2262 /* free format: prepare to compute frame size */ |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2263 s->frame_size = -1; |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2264 return -1; |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2265 } |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2266 /* update codec info */ |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2267 avctx->channels = s->nb_channels; |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2268 avctx->bit_rate = s->bit_rate; |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2269 avctx->sub_id = s->layer; |
|
82
46ee548e47e4
added completely new mpeg audio decoder (integer only, free format support, lsf/mpeg25 support, high/low precision support, simpler code)
glantau
parents:
0
diff
changeset
|
2270 |
| 10240 | 2271 if(*data_size < 1152*avctx->channels*sizeof(OUT_INT)) |
| 2272 return -1; | |
|
10242
359554637332
Set data_size to 0 to avoid having it uninitialized.
michael
parents:
10241
diff
changeset
|
2273 *data_size = 0; |
| 10240 | 2274 |
| 3687 | 2275 if(s->frame_size<=0 || s->frame_size > buf_size){ |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2276 av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2277 return -1; |
| 3687 | 2278 }else if(s->frame_size < buf_size){ |
| 2279 av_log(avctx, AV_LOG_ERROR, "incorrect frame size\n"); | |
|
5076
796c2a5481ad
make decoder decode the first frame properly if theres more than just one
michael
parents:
5052
diff
changeset
|
2280 buf_size= s->frame_size; |
| 0 | 2281 } |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2282 |
|
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2283 out_size = mp_decode_frame(s, out_samples, buf, buf_size); |
|
4104
04ff8026d9c0
dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents:
4103
diff
changeset
|
2284 if(out_size>=0){ |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2285 *data_size = out_size; |
|
4104
04ff8026d9c0
dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents:
4103
diff
changeset
|
2286 avctx->sample_rate = s->sample_rate; |
|
04ff8026d9c0
dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents:
4103
diff
changeset
|
2287 //FIXME maybe move the other codec info stuff from above here too |
|
04ff8026d9c0
dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents:
4103
diff
changeset
|
2288 }else |
| 3938 | 2289 av_log(avctx, AV_LOG_DEBUG, "Error while decoding MPEG audio frame.\n"); //FIXME return -1 / but also return the number of bytes consumed |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2290 s->frame_size = 0; |
|
9896
bbefbca72722
Drop code that attempts to decode frames that are prefixed by junk.
michael
parents:
9603
diff
changeset
|
2291 return buf_size; |
| 0 | 2292 } |
| 2293 | |
| 4203 | 2294 static void flush(AVCodecContext *avctx){ |
| 2295 MPADecodeContext *s = avctx->priv_data; | |
|
6137
5ef885b008c0
Clear synth_buf on flush(). Part of a patch by Brian Brice bbrice gmail com.
michael
parents:
6136
diff
changeset
|
2296 memset(s->synth_buf, 0, sizeof(s->synth_buf)); |
| 4203 | 2297 s->last_buf_size= 0; |
| 2298 } | |
| 2299 | |
| 8590 | 2300 #if CONFIG_MP3ADU_DECODER |
| 2432 | 2301 static int decode_frame_adu(AVCodecContext * avctx, |
| 2979 | 2302 void *data, int *data_size, |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2303 AVPacket *avpkt) |
| 2432 | 2304 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2305 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2306 int buf_size = avpkt->size; |
| 2432 | 2307 MPADecodeContext *s = avctx->priv_data; |
| 2308 uint32_t header; | |
| 2309 int len, out_size; | |
| 2479 | 2310 OUT_INT *out_samples = data; |
| 2432 | 2311 |
| 2312 len = buf_size; | |
| 2313 | |
| 2314 // Discard too short frames | |
| 2315 if (buf_size < HEADER_SIZE) { | |
| 2316 *data_size = 0; | |
| 2317 return buf_size; | |
| 2318 } | |
| 2319 | |
| 2320 | |
| 2321 if (len > MPA_MAX_CODED_FRAME_SIZE) | |
| 2322 len = MPA_MAX_CODED_FRAME_SIZE; | |
| 2323 | |
| 2324 // Get header and restore sync word | |
| 5089 | 2325 header = AV_RB32(buf) | 0xffe00000; |
| 2432 | 2326 |
| 2472 | 2327 if (ff_mpa_check_header(header) < 0) { // Bad header, discard frame |
| 2432 | 2328 *data_size = 0; |
| 2329 return buf_size; | |
| 2330 } | |
| 2331 | |
| 8641 | 2332 ff_mpegaudio_decode_header((MPADecodeHeader *)s, header); |
| 2432 | 2333 /* update codec info */ |
| 2334 avctx->sample_rate = s->sample_rate; | |
| 2335 avctx->channels = s->nb_channels; | |
| 2336 avctx->bit_rate = s->bit_rate; | |
| 2337 avctx->sub_id = s->layer; | |
| 2338 | |
|
6510
771eb7ea8b3f
correctly set avctx->frame_size for mp3on4 and mp3adu
bcoudurier
parents:
6350
diff
changeset
|
2339 s->frame_size = len; |
| 2432 | 2340 |
| 2341 if (avctx->parse_only) { | |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2342 out_size = buf_size; |
| 2432 | 2343 } else { |
|
3634
fa4beebb74a6
remove duplicated parser, people who pass random gibblets of the bitstream into the decoder will have to pass it through a AVParser like for all other codecs too
michael
parents:
3627
diff
changeset
|
2344 out_size = mp_decode_frame(s, out_samples, buf, buf_size); |
| 2432 | 2345 } |
| 2346 | |
| 2347 *data_size = out_size; | |
| 2348 return buf_size; | |
| 2349 } | |
| 3777 | 2350 #endif /* CONFIG_MP3ADU_DECODER */ |
| 2432 | 2351 |
| 8590 | 2352 #if CONFIG_MP3ON4_DECODER |
| 6694 | 2353 |
|
6699
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2354 /** |
|
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2355 * Context for MP3On4 decoder |
|
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2356 */ |
|
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2357 typedef struct MP3On4DecodeContext { |
|
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2358 int frames; ///< number of mp3 frames per block (number of mp3 decoder instances) |
|
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2359 int syncword; ///< syncword patch |
| 6700 | 2360 const uint8_t *coff; ///< channels offsets in output buffer |
|
6699
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2361 MPADecodeContext *mp3decctx[5]; ///< MPADecodeContext for every decoder instance |
|
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2362 } MP3On4DecodeContext; |
|
99cf02b8f831
move MP3On4DecodeContext def near the code and under ifdef
bcoudurier
parents:
6698
diff
changeset
|
2363 |
| 6694 | 2364 #include "mpeg4audio.h" |
| 2365 | |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2366 /* Next 3 arrays are indexed by channel config number (passed via codecdata) */ |
|
6696
c3182ffe1689
remove old draft last case not present anymore in iso specs
bcoudurier
parents:
6694
diff
changeset
|
2367 static const uint8_t mp3Frames[8] = {0,1,1,2,3,3,4,5}; /* number of mp3 decoder instances */ |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2368 /* offsets into output buffer, assume output order is FL FR BL BR C LFE */ |
|
6696
c3182ffe1689
remove old draft last case not present anymore in iso specs
bcoudurier
parents:
6694
diff
changeset
|
2369 static const uint8_t chan_offset[8][5] = { |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2370 {0}, |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2371 {0}, // C |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2372 {0}, // FLR |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2373 {2,0}, // C FLR |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2374 {2,0,3}, // C FLR BS |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2375 {4,0,2}, // C FLR BLRS |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2376 {4,0,2,5}, // C FLR BLRS LFE |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2377 {4,0,2,6,5}, // C FLR BLRS BLR LFE |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2378 }; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2379 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2380 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2381 static int decode_init_mp3on4(AVCodecContext * avctx) |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2382 { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2383 MP3On4DecodeContext *s = avctx->priv_data; |
| 6694 | 2384 MPEG4AudioConfig cfg; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2385 int i; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2386 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2387 if ((avctx->extradata_size < 2) || (avctx->extradata == NULL)) { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2388 av_log(avctx, AV_LOG_ERROR, "Codec extradata missing or too short.\n"); |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2389 return -1; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2390 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2391 |
| 6694 | 2392 ff_mpeg4audio_get_config(&cfg, avctx->extradata, avctx->extradata_size); |
| 2393 if (!cfg.chan_config || cfg.chan_config > 7) { | |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2394 av_log(avctx, AV_LOG_ERROR, "Invalid channel config number.\n"); |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2395 return -1; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2396 } |
| 6700 | 2397 s->frames = mp3Frames[cfg.chan_config]; |
| 2398 s->coff = chan_offset[cfg.chan_config]; | |
| 2399 avctx->channels = ff_mpeg4audio_channels[cfg.chan_config]; | |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2400 |
|
6698
06f422f73ade
correctly patch syncword for samples rates < 16000, decoder now fully support all iso ref files
bcoudurier
parents:
6697
diff
changeset
|
2401 if (cfg.sample_rate < 16000) |
|
06f422f73ade
correctly patch syncword for samples rates < 16000, decoder now fully support all iso ref files
bcoudurier
parents:
6697
diff
changeset
|
2402 s->syncword = 0xffe00000; |
|
06f422f73ade
correctly patch syncword for samples rates < 16000, decoder now fully support all iso ref files
bcoudurier
parents:
6697
diff
changeset
|
2403 else |
|
06f422f73ade
correctly patch syncword for samples rates < 16000, decoder now fully support all iso ref files
bcoudurier
parents:
6697
diff
changeset
|
2404 s->syncword = 0xfff00000; |
|
06f422f73ade
correctly patch syncword for samples rates < 16000, decoder now fully support all iso ref files
bcoudurier
parents:
6697
diff
changeset
|
2405 |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2406 /* Init the first mp3 decoder in standard way, so that all tables get builded |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2407 * We replace avctx->priv_data with the context of the first decoder so that |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2408 * decode_init() does not have to be changed. |
| 6350 | 2409 * Other decoders will be initialized here copying data from the first context |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2410 */ |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2411 // Allocate zeroed memory for the first decoder context |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2412 s->mp3decctx[0] = av_mallocz(sizeof(MPADecodeContext)); |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2413 // Put decoder context in place to make init_decode() happy |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2414 avctx->priv_data = s->mp3decctx[0]; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2415 decode_init(avctx); |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2416 // Restore mp3on4 context pointer |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2417 avctx->priv_data = s; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2418 s->mp3decctx[0]->adu_mode = 1; // Set adu mode |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2419 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2420 /* Create a separate codec/context for each frame (first is already ok). |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2421 * Each frame is 1 or 2 channels - up to 5 frames allowed |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2422 */ |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2423 for (i = 1; i < s->frames; i++) { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2424 s->mp3decctx[i] = av_mallocz(sizeof(MPADecodeContext)); |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2425 s->mp3decctx[i]->adu_mode = 1; |
| 4652 | 2426 s->mp3decctx[i]->avctx = avctx; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2427 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2428 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2429 return 0; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2430 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2431 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2432 |
|
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8718
diff
changeset
|
2433 static av_cold int decode_close_mp3on4(AVCodecContext * avctx) |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2434 { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2435 MP3On4DecodeContext *s = avctx->priv_data; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2436 int i; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2437 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2438 for (i = 0; i < s->frames; i++) |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2439 if (s->mp3decctx[i]) |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2440 av_free(s->mp3decctx[i]); |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2441 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2442 return 0; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2443 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2444 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2445 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2446 static int decode_frame_mp3on4(AVCodecContext * avctx, |
| 2979 | 2447 void *data, int *data_size, |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2448 AVPacket *avpkt) |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2449 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2450 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
2451 int buf_size = avpkt->size; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2452 MP3On4DecodeContext *s = avctx->priv_data; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2453 MPADecodeContext *m; |
| 6704 | 2454 int fsize, len = buf_size, out_size = 0; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2455 uint32_t header; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2456 OUT_INT *out_samples = data; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2457 OUT_INT decoded_buf[MPA_FRAME_SIZE * MPA_MAX_CHANNELS]; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2458 OUT_INT *outptr, *bp; |
| 6702 | 2459 int fr, j, n; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2460 |
| 10241 | 2461 if(*data_size < MPA_FRAME_SIZE * MPA_MAX_CHANNELS * s->frames * sizeof(OUT_INT)) |
| 2462 return -1; | |
| 2463 | |
| 6688 | 2464 *data_size = 0; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2465 // Discard too short frames |
| 6688 | 2466 if (buf_size < HEADER_SIZE) |
| 2467 return -1; | |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2468 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2469 // If only one decoder interleave is not needed |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2470 outptr = s->frames == 1 ? out_samples : decoded_buf; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2471 |
| 6702 | 2472 avctx->bit_rate = 0; |
| 2473 | |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2474 for (fr = 0; fr < s->frames; fr++) { |
| 6692 | 2475 fsize = AV_RB16(buf) >> 4; |
| 6689 | 2476 fsize = FFMIN3(fsize, len, MPA_MAX_CODED_FRAME_SIZE); |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2477 m = s->mp3decctx[fr]; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2478 assert (m != NULL); |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2479 |
|
6698
06f422f73ade
correctly patch syncword for samples rates < 16000, decoder now fully support all iso ref files
bcoudurier
parents:
6697
diff
changeset
|
2480 header = (AV_RB32(buf) & 0x000fffff) | s->syncword; // patch header |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2481 |
|
6705
d5515254fbbd
break if error in header so it can output already decoded frames
bcoudurier
parents:
6704
diff
changeset
|
2482 if (ff_mpa_check_header(header) < 0) // Bad header, discard block |
|
d5515254fbbd
break if error in header so it can output already decoded frames
bcoudurier
parents:
6704
diff
changeset
|
2483 break; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2484 |
| 8641 | 2485 ff_mpegaudio_decode_header((MPADecodeHeader *)m, header); |
| 6697 | 2486 out_size += mp_decode_frame(m, outptr, buf, fsize); |
| 6692 | 2487 buf += fsize; |
| 2488 len -= fsize; | |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2489 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2490 if(s->frames > 1) { |
| 6691 | 2491 n = m->avctx->frame_size*m->nb_channels; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2492 /* interleave output data */ |
| 6700 | 2493 bp = out_samples + s->coff[fr]; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2494 if(m->nb_channels == 1) { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2495 for(j = 0; j < n; j++) { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2496 *bp = decoded_buf[j]; |
| 6701 | 2497 bp += avctx->channels; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2498 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2499 } else { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2500 for(j = 0; j < n; j++) { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2501 bp[0] = decoded_buf[j++]; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2502 bp[1] = decoded_buf[j]; |
| 6701 | 2503 bp += avctx->channels; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2504 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2505 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2506 } |
| 6702 | 2507 avctx->bit_rate += m->bit_rate; |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2508 } |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2509 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2510 /* update codec info */ |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2511 avctx->sample_rate = s->mp3decctx[0]->sample_rate; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2512 |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2513 *data_size = out_size; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2514 return buf_size; |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2515 } |
| 3777 | 2516 #endif /* CONFIG_MP3ON4_DECODER */ |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2517 |
| 11707 | 2518 #if !CONFIG_FLOAT |
| 8590 | 2519 #if CONFIG_MP1_DECODER |
|
8586
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2520 AVCodec mp1_decoder = |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2521 { |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2522 "mp1", |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11374
diff
changeset
|
2523 AVMEDIA_TYPE_AUDIO, |
|
8586
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2524 CODEC_ID_MP1, |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2525 sizeof(MPADecodeContext), |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2526 decode_init, |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2527 NULL, |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2528 NULL, |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2529 decode_frame, |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2530 CODEC_CAP_PARSE_ONLY, |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2531 .flush= flush, |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2532 .long_name= NULL_IF_CONFIG_SMALL("MP1 (MPEG audio layer 1)"), |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2533 }; |
|
d7d0cde5f308
Add dummy mp1_decoder to complement the existing dummy mp2/mp3 decoders.
michael
parents:
8439
diff
changeset
|
2534 #endif |
| 8590 | 2535 #if CONFIG_MP2_DECODER |
| 322 | 2536 AVCodec mp2_decoder = |
| 0 | 2537 { |
| 322 | 2538 "mp2", |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11374
diff
changeset
|
2539 AVMEDIA_TYPE_AUDIO, |
| 0 | 2540 CODEC_ID_MP2, |
| 2541 sizeof(MPADecodeContext), | |
| 2542 decode_init, | |
| 2543 NULL, | |
| 2544 NULL, | |
| 2545 decode_frame, | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
2546 CODEC_CAP_PARSE_ONLY, |
|
6136
85f3acb225e9
Flush mp2 as well on seeking. Part of a patch by Brian Brice bbrice gmail com.
michael
parents:
5886
diff
changeset
|
2547 .flush= flush, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
2548 .long_name= NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"), |
| 0 | 2549 }; |
| 3777 | 2550 #endif |
| 8590 | 2551 #if CONFIG_MP3_DECODER |
| 322 | 2552 AVCodec mp3_decoder = |
| 2553 { | |
| 2554 "mp3", | |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11374
diff
changeset
|
2555 AVMEDIA_TYPE_AUDIO, |
| 1448 | 2556 CODEC_ID_MP3, |
| 322 | 2557 sizeof(MPADecodeContext), |
| 2558 decode_init, | |
| 2559 NULL, | |
| 2560 NULL, | |
| 2561 decode_frame, | |
|
1428
aece5836c588
fixed audio frame buffering problem (should correct problems on some streams) - faster synthesis filter - prototype 'parse_only' support
bellard
parents:
1414
diff
changeset
|
2562 CODEC_CAP_PARSE_ONLY, |
| 4203 | 2563 .flush= flush, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
2564 .long_name= NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"), |
| 322 | 2565 }; |
| 3777 | 2566 #endif |
| 8590 | 2567 #if CONFIG_MP3ADU_DECODER |
| 2432 | 2568 AVCodec mp3adu_decoder = |
| 2569 { | |
| 2570 "mp3adu", | |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11374
diff
changeset
|
2571 AVMEDIA_TYPE_AUDIO, |
| 2432 | 2572 CODEC_ID_MP3ADU, |
| 2573 sizeof(MPADecodeContext), | |
| 2574 decode_init, | |
| 2575 NULL, | |
| 2576 NULL, | |
| 2577 decode_frame_adu, | |
| 2578 CODEC_CAP_PARSE_ONLY, | |
| 4203 | 2579 .flush= flush, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
2580 .long_name= NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"), |
| 2432 | 2581 }; |
| 3777 | 2582 #endif |
| 8590 | 2583 #if CONFIG_MP3ON4_DECODER |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2584 AVCodec mp3on4_decoder = |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2585 { |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2586 "mp3on4", |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11374
diff
changeset
|
2587 AVMEDIA_TYPE_AUDIO, |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2588 CODEC_ID_MP3ON4, |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2589 sizeof(MP3On4DecodeContext), |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2590 decode_init_mp3on4, |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2591 NULL, |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2592 decode_close_mp3on4, |
|
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2593 decode_frame_mp3on4, |
| 4203 | 2594 .flush= flush, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
2595 .long_name= NULL_IF_CONFIG_SMALL("MP3onMP4"), |
|
2507
0334caf0f0ce
Multichannel mp3 in mp4 support ISO/IEC 14496-3:2001/FPDAM 3 (MP3onMP4)
rtognimp
parents:
2496
diff
changeset
|
2596 }; |
| 3777 | 2597 #endif |
| 11707 | 2598 #endif |
