Mercurial > libavcodec.hg
annotate mpegaudio.h @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | b4888704c11e |
children |
rev | line source |
---|---|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
1 /* |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
2 * copyright (c) 2001 Fabrice Bellard |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
3 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
4 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
5 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
7 * modify it under the terms of the GNU Lesser General Public |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
8 * 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:
3699
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
10 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
14 * Lesser General Public License for more details. |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
15 * |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
16 * 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:
3699
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
19 */ |
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2979
diff
changeset
|
20 |
1106 | 21 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11369
diff
changeset
|
22 * @file |
1106 | 23 * mpeg audio declarations for both encoder and decoder. |
24 */ | |
84 | 25 |
7760 | 26 #ifndef AVCODEC_MPEGAUDIO_H |
27 #define AVCODEC_MPEGAUDIO_H | |
5050 | 28 |
11707 | 29 #ifndef CONFIG_FLOAT |
30 # define CONFIG_FLOAT 0 | |
31 #endif | |
32 | |
5052
d981eb275c8f
remove dependency of mpeg audio encoder over mpeg audio decoder
aurel
parents:
5051
diff
changeset
|
33 #include "avcodec.h" |
9428 | 34 #include "get_bits.h" |
5050 | 35 #include "dsputil.h" |
12026
3f3d08bb5cf8
More mp{1,2,3} 32-point DCT transform to our common DCT framework.
vitor
parents:
11939
diff
changeset
|
36 #include "fft.h" |
5050 | 37 |
8600 | 38 #define CONFIG_AUDIO_NONSHORT 0 |
39 | |
84 | 40 /* max frame size, in samples */ |
2967 | 41 #define MPA_FRAME_SIZE 1152 |
0 | 42 |
43 /* max compressed frame size */ | |
84 | 44 #define MPA_MAX_CODED_FRAME_SIZE 1792 |
0 | 45 |
46 #define MPA_MAX_CHANNELS 2 | |
47 | |
48 #define SBLIMIT 32 /* number of subbands */ | |
84 | 49 |
50 #define MPA_STEREO 0 | |
51 #define MPA_JSTEREO 1 | |
52 #define MPA_DUAL 2 | |
53 #define MPA_MONO 3 | |
54 | |
2472 | 55 /* header + layer + bitrate + freq + lsf/mpeg25 */ |
56 #define SAME_HEADER_MASK \ | |
57 (0xffe00000 | (3 << 17) | (0xf << 12) | (3 << 10) | (3 << 19)) | |
58 | |
5033
3c034e71667f
move mp3_header_decompress bitstream filter in its own file
aurel
parents:
5031
diff
changeset
|
59 #define MP3_MASK 0xFFFE0CCF |
3c034e71667f
move mp3_header_decompress bitstream filter in its own file
aurel
parents:
5031
diff
changeset
|
60 |
8594
c5349ca95c08
Replace #ifdef CONFIG_ preprocessor check by #if CONFIG_.
diego
parents:
8592
diff
changeset
|
61 #if CONFIG_MPEGAUDIO_HP |
2913 | 62 #define FRAC_BITS 23 /* fractional bits for sb_samples and dct */ |
63 #define WFRAC_BITS 16 /* fractional bits for window */ | |
64 #else | |
65 #define FRAC_BITS 15 /* fractional bits for sb_samples and dct */ | |
66 #define WFRAC_BITS 14 /* fractional bits for window */ | |
67 #endif | |
68 | |
5161 | 69 #define FRAC_ONE (1 << FRAC_BITS) |
70 | |
71 #define FIX(a) ((int)((a) * FRAC_ONE)) | |
72 | |
11707 | 73 #if CONFIG_FLOAT |
74 typedef float OUT_INT; | |
75 #define OUT_FMT SAMPLE_FMT_FLT | |
76 #elif CONFIG_MPEGAUDIO_HP && CONFIG_AUDIO_NONSHORT | |
2913 | 77 typedef int32_t OUT_INT; |
78 #define OUT_MAX INT32_MAX | |
79 #define OUT_MIN INT32_MIN | |
80 #define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 31) | |
8598
6550218be3b7
simplify: group all the AUDIO_NONSHORT parameters in the same place
aurel
parents:
8594
diff
changeset
|
81 #define OUT_FMT SAMPLE_FMT_S32 |
2913 | 82 #else |
83 typedef int16_t OUT_INT; | |
84 #define OUT_MAX INT16_MAX | |
85 #define OUT_MIN INT16_MIN | |
86 #define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15) | |
8598
6550218be3b7
simplify: group all the AUDIO_NONSHORT parameters in the same place
aurel
parents:
8594
diff
changeset
|
87 #define OUT_FMT SAMPLE_FMT_S16 |
2913 | 88 #endif |
89 | |
11707 | 90 #if CONFIG_FLOAT |
91 # define INTFLOAT float | |
92 typedef float MPA_INT; | |
93 #elif FRAC_BITS <= 15 | |
94 # define INTFLOAT int | |
2913 | 95 typedef int16_t MPA_INT; |
96 #else | |
11707 | 97 # define INTFLOAT int |
2913 | 98 typedef int32_t MPA_INT; |
99 #endif | |
100 | |
5050 | 101 #define BACKSTEP_SIZE 512 |
102 #define EXTRABYTES 24 | |
103 | |
10494 | 104 /* layer 3 "granule" */ |
105 typedef struct GranuleDef { | |
106 uint8_t scfsi; | |
107 int part2_3_length; | |
108 int big_values; | |
109 int global_gain; | |
110 int scalefac_compress; | |
111 uint8_t block_type; | |
112 uint8_t switch_point; | |
113 int table_select[3]; | |
114 int subblock_gain[3]; | |
115 uint8_t scalefac_scale; | |
116 uint8_t count1table_select; | |
117 int region_size[3]; /* number of huffman codes in each region */ | |
118 int preflag; | |
119 int short_start, long_end; /* long/short band indexes */ | |
120 uint8_t scale_factors[40]; | |
11707 | 121 INTFLOAT sb_hybrid[SBLIMIT * 18]; /* 576 samples */ |
10494 | 122 } GranuleDef; |
5050 | 123 |
8641 | 124 #define MPA_DECODE_HEADER \ |
125 int frame_size; \ | |
126 int error_protection; \ | |
127 int layer; \ | |
128 int sample_rate; \ | |
129 int sample_rate_index; /* between 0 and 8 */ \ | |
130 int bit_rate; \ | |
131 int nb_channels; \ | |
132 int mode; \ | |
133 int mode_ext; \ | |
134 int lsf; | |
135 | |
136 typedef struct MPADecodeHeader { | |
137 MPA_DECODE_HEADER | |
138 } MPADecodeHeader; | |
139 | |
5050 | 140 typedef struct MPADecodeContext { |
8641 | 141 MPA_DECODE_HEADER |
10093 | 142 uint8_t last_buf[2*BACKSTEP_SIZE + EXTRABYTES]; |
5050 | 143 int last_buf_size; |
144 /* next header (used in free format parsing) */ | |
145 uint32_t free_format_next_header; | |
146 GetBitContext gb; | |
147 GetBitContext in_gb; | |
11369 | 148 DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512 * 2]; |
5050 | 149 int synth_buf_offset[MPA_MAX_CHANNELS]; |
11707 | 150 DECLARE_ALIGNED(16, INTFLOAT, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT]; |
151 INTFLOAT mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ | |
10494 | 152 GranuleDef granules[2][2]; /* Used in Layer 3 */ |
5050 | 153 #ifdef DEBUG |
154 int frame_count; | |
155 #endif | |
156 int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3 | |
157 int dither_state; | |
7831 | 158 int error_recognition; |
5050 | 159 AVCodecContext* avctx; |
12026
3f3d08bb5cf8
More mp{1,2,3} 32-point DCT transform to our common DCT framework.
vitor
parents:
11939
diff
changeset
|
160 #if CONFIG_FLOAT |
3f3d08bb5cf8
More mp{1,2,3} 32-point DCT transform to our common DCT framework.
vitor
parents:
11939
diff
changeset
|
161 DCTContext dct; |
3f3d08bb5cf8
More mp{1,2,3} 32-point DCT transform to our common DCT framework.
vitor
parents:
11939
diff
changeset
|
162 #endif |
11885
0e777af9160a
Factorize the mpegaudio windowing code in a function and call it by a
vitor
parents:
11707
diff
changeset
|
163 void (*apply_window_mp3)(MPA_INT *synth_buf, MPA_INT *window, |
0e777af9160a
Factorize the mpegaudio windowing code in a function and call it by a
vitor
parents:
11707
diff
changeset
|
164 int *dither_state, OUT_INT *samples, int incr); |
5050 | 165 } MPADecodeContext; |
166 | |
5161 | 167 /* layer 3 huffman tables */ |
168 typedef struct HuffTable { | |
169 int xsize; | |
170 const uint8_t *bits; | |
171 const uint16_t *codes; | |
172 } HuffTable; | |
173 | |
5052
d981eb275c8f
remove dependency of mpeg audio encoder over mpeg audio decoder
aurel
parents:
5051
diff
changeset
|
174 int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf); |
8420
2b0d01be134f
Change mpeg audio parser so it only sets frame_size, channels and bit_rate
michael
parents:
7831
diff
changeset
|
175 int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bitrate); |
10440
899237b1961f
mpegaudiodec, mpc and qdm2 all use the same mpa_synth window, so make
reimar
parents:
10093
diff
changeset
|
176 extern MPA_INT ff_mpa_synth_window[]; |
2913 | 177 void ff_mpa_synth_init(MPA_INT *window); |
178 void ff_mpa_synth_filter(MPA_INT *synth_buf_ptr, int *synth_buf_offset, | |
2979 | 179 MPA_INT *window, int *dither_state, |
2913 | 180 OUT_INT *samples, int incr, |
11707 | 181 INTFLOAT sb_samples[SBLIMIT]); |
182 | |
183 void ff_mpa_synth_init_float(MPA_INT *window); | |
11885
0e777af9160a
Factorize the mpegaudio windowing code in a function and call it by a
vitor
parents:
11707
diff
changeset
|
184 void ff_mpa_synth_filter_float(MPADecodeContext *s, |
0e777af9160a
Factorize the mpegaudio windowing code in a function and call it by a
vitor
parents:
11707
diff
changeset
|
185 MPA_INT *synth_buf_ptr, int *synth_buf_offset, |
11707 | 186 MPA_INT *window, int *dither_state, |
187 OUT_INT *samples, int incr, | |
188 INTFLOAT sb_samples[SBLIMIT]); | |
0 | 189 |
11939
ef338bd70180
SSE-optimized MP3 floating point windowing functions
vitor
parents:
11885
diff
changeset
|
190 void ff_mpegaudiodec_init_mmx(MPADecodeContext *s); |
12040 | 191 void ff_mpegaudiodec_init_altivec(MPADecodeContext *s); |
11939
ef338bd70180
SSE-optimized MP3 floating point windowing functions
vitor
parents:
11885
diff
changeset
|
192 |
2472 | 193 /* fast header check for resync */ |
194 static inline int ff_mpa_check_header(uint32_t header){ | |
195 /* header */ | |
196 if ((header & 0xffe00000) != 0xffe00000) | |
197 return -1; | |
198 /* layer check */ | |
199 if ((header & (3<<17)) == 0) | |
200 return -1; | |
201 /* bit rate */ | |
202 if ((header & (0xf<<12)) == 0xf<<12) | |
203 return -1; | |
204 /* frequency */ | |
205 if ((header & (3<<10)) == 3<<10) | |
206 return -1; | |
207 return 0; | |
208 } | |
5050 | 209 |
7760 | 210 #endif /* AVCODEC_MPEGAUDIO_H */ |