Mercurial > libavcodec.hg
annotate mpegaudio.h @ 6017:e1404acccac3 libavcodec
Actually return with an error condition if we're being asked to deal with too
many reference frames. Also check max num ref frames against our internal
ref buffer sizes.
Part of fix for roundup issue 281
author | heydowns |
---|---|
date | Fri, 14 Dec 2007 05:48:27 +0000 |
parents | 1d83e9c34641 |
children | c4a4495715dd |
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 /** |
22 * @file mpegaudio.h | |
23 * mpeg audio declarations for both encoder and decoder. | |
24 */ | |
84 | 25 |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5161
diff
changeset
|
26 #ifndef FFMPEG_MPEGAUDIO_H |
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5161
diff
changeset
|
27 #define FFMPEG_MPEGAUDIO_H |
5050 | 28 |
5052
d981eb275c8f
remove dependency of mpeg audio encoder over mpeg audio decoder
aurel
parents:
5051
diff
changeset
|
29 #include "avcodec.h" |
5050 | 30 #include "bitstream.h" |
31 #include "dsputil.h" | |
32 | |
84 | 33 /* max frame size, in samples */ |
2967 | 34 #define MPA_FRAME_SIZE 1152 |
0 | 35 |
36 /* max compressed frame size */ | |
84 | 37 #define MPA_MAX_CODED_FRAME_SIZE 1792 |
0 | 38 |
39 #define MPA_MAX_CHANNELS 2 | |
40 | |
41 #define SBLIMIT 32 /* number of subbands */ | |
84 | 42 |
43 #define MPA_STEREO 0 | |
44 #define MPA_JSTEREO 1 | |
45 #define MPA_DUAL 2 | |
46 #define MPA_MONO 3 | |
47 | |
2472 | 48 /* header + layer + bitrate + freq + lsf/mpeg25 */ |
49 #define SAME_HEADER_MASK \ | |
50 (0xffe00000 | (3 << 17) | (0xf << 12) | (3 << 10) | (3 << 19)) | |
51 | |
5033
3c034e71667f
move mp3_header_decompress bitstream filter in its own file
aurel
parents:
5031
diff
changeset
|
52 #define MP3_MASK 0xFFFE0CCF |
3c034e71667f
move mp3_header_decompress bitstream filter in its own file
aurel
parents:
5031
diff
changeset
|
53 |
2913 | 54 /* define USE_HIGHPRECISION to have a bit exact (but slower) mpeg |
55 audio decoder */ | |
56 | |
57 #ifdef USE_HIGHPRECISION | |
58 #define FRAC_BITS 23 /* fractional bits for sb_samples and dct */ | |
59 #define WFRAC_BITS 16 /* fractional bits for window */ | |
60 #else | |
61 #define FRAC_BITS 15 /* fractional bits for sb_samples and dct */ | |
62 #define WFRAC_BITS 14 /* fractional bits for window */ | |
63 #endif | |
64 | |
5161 | 65 #define FRAC_ONE (1 << FRAC_BITS) |
66 | |
67 #define FIX(a) ((int)((a) * FRAC_ONE)) | |
68 | |
2913 | 69 #if defined(USE_HIGHPRECISION) && defined(CONFIG_AUDIO_NONSHORT) |
70 typedef int32_t OUT_INT; | |
71 #define OUT_MAX INT32_MAX | |
72 #define OUT_MIN INT32_MIN | |
73 #define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 31) | |
74 #else | |
75 typedef int16_t OUT_INT; | |
76 #define OUT_MAX INT16_MAX | |
77 #define OUT_MIN INT16_MIN | |
78 #define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15) | |
79 #endif | |
80 | |
81 #if FRAC_BITS <= 15 | |
82 typedef int16_t MPA_INT; | |
83 #else | |
84 typedef int32_t MPA_INT; | |
85 #endif | |
86 | |
5050 | 87 #define BACKSTEP_SIZE 512 |
88 #define EXTRABYTES 24 | |
89 | |
90 struct GranuleDef; | |
91 | |
92 typedef struct MPADecodeContext { | |
93 DECLARE_ALIGNED_8(uint8_t, last_buf[2*BACKSTEP_SIZE + EXTRABYTES]); | |
94 int last_buf_size; | |
95 int frame_size; | |
96 /* next header (used in free format parsing) */ | |
97 uint32_t free_format_next_header; | |
98 int error_protection; | |
99 int layer; | |
100 int sample_rate; | |
101 int sample_rate_index; /* between 0 and 8 */ | |
102 int bit_rate; | |
103 GetBitContext gb; | |
104 GetBitContext in_gb; | |
105 int nb_channels; | |
106 int mode; | |
107 int mode_ext; | |
108 int lsf; | |
109 DECLARE_ALIGNED_16(MPA_INT, synth_buf[MPA_MAX_CHANNELS][512 * 2]); | |
110 int synth_buf_offset[MPA_MAX_CHANNELS]; | |
111 DECLARE_ALIGNED_16(int32_t, sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]); | |
112 int32_t mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ | |
113 #ifdef DEBUG | |
114 int frame_count; | |
115 #endif | |
116 void (*compute_antialias)(struct MPADecodeContext *s, struct GranuleDef *g); | |
117 int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3 | |
118 int dither_state; | |
119 int error_resilience; | |
120 AVCodecContext* avctx; | |
121 } MPADecodeContext; | |
122 | |
5161 | 123 /* layer 3 huffman tables */ |
124 typedef struct HuffTable { | |
125 int xsize; | |
126 const uint8_t *bits; | |
127 const uint16_t *codes; | |
128 } HuffTable; | |
129 | |
5052
d981eb275c8f
remove dependency of mpeg audio encoder over mpeg audio decoder
aurel
parents:
5051
diff
changeset
|
130 int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf); |
5051 | 131 int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate); |
2913 | 132 void ff_mpa_synth_init(MPA_INT *window); |
133 void ff_mpa_synth_filter(MPA_INT *synth_buf_ptr, int *synth_buf_offset, | |
2979 | 134 MPA_INT *window, int *dither_state, |
2913 | 135 OUT_INT *samples, int incr, |
136 int32_t sb_samples[SBLIMIT]); | |
0 | 137 |
2472 | 138 /* fast header check for resync */ |
139 static inline int ff_mpa_check_header(uint32_t header){ | |
140 /* header */ | |
141 if ((header & 0xffe00000) != 0xffe00000) | |
142 return -1; | |
143 /* layer check */ | |
144 if ((header & (3<<17)) == 0) | |
145 return -1; | |
146 /* bit rate */ | |
147 if ((header & (0xf<<12)) == 0xf<<12) | |
148 return -1; | |
149 /* frequency */ | |
150 if ((header & (3<<10)) == 3<<10) | |
151 return -1; | |
152 return 0; | |
153 } | |
5050 | 154 |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5161
diff
changeset
|
155 #endif /* FFMPEG_MPEGAUDIO_H */ |