Mercurial > libavcodec.hg
annotate mpc7.c @ 6323:e6da66f378c7 libavcodec
mpegvideo.h has two function declarations with the 'inline' specifier
but no definition for those functions. The C standard requires a
definition to appear in the same translation unit for any function
declared with 'inline'. Most of the files including mpegvideo.h do not
define those functions. Fix this by removing the 'inline' specifiers
from the header.
patch by Uoti Urpala
author | diego |
---|---|
date | Sun, 03 Feb 2008 17:54:30 +0000 |
parents | 67986191913d |
children | 8e63d869a904 |
rev | line source |
---|---|
4328 | 1 /* |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
2 * Musepack SV7 decoder |
4328 | 3 * Copyright (c) 2006 Konstantin Shishkov |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
23 * @file mpc7.c Musepack SV7 decoder |
4328 | 24 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples |
25 * divided into 32 subbands. | |
26 */ | |
27 | |
28 #include "avcodec.h" | |
29 #include "bitstream.h" | |
30 #include "dsputil.h" | |
4536 | 31 #include "random.h" |
4328 | 32 |
33 #ifdef CONFIG_MPEGAUDIO_HP | |
34 #define USE_HIGHPRECISION | |
35 #endif | |
36 #include "mpegaudio.h" | |
37 | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
38 #include "mpc.h" |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
39 #include "mpc7data.h" |
4328 | 40 |
41 #define BANDS 32 | |
42 #define SAMPLES_PER_BAND 36 | |
43 #define MPC_FRAME_SIZE (BANDS * SAMPLES_PER_BAND) | |
44 | |
45 static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2]; | |
46 | |
47 static int mpc7_decode_init(AVCodecContext * avctx) | |
48 { | |
49 int i, j; | |
50 MPCContext *c = avctx->priv_data; | |
51 GetBitContext gb; | |
52 uint8_t buf[16]; | |
53 static int vlc_inited = 0; | |
54 | |
55 if(avctx->extradata_size < 16){ | |
56 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); | |
57 return -1; | |
58 } | |
59 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); | |
4536 | 60 av_init_random(0xDEADBEEF, &c->rnd); |
4328 | 61 dsputil_init(&c->dsp, avctx); |
6242
67986191913d
Casts to silcence "incompatible pointer type" warnings.
michael
parents:
6218
diff
changeset
|
62 c->dsp.bswap_buf((uint32_t*)buf, (const uint32_t*)avctx->extradata, 4); |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
63 ff_mpc_init(); |
4328 | 64 init_get_bits(&gb, buf, 128); |
65 | |
66 c->IS = get_bits1(&gb); | |
67 c->MSS = get_bits1(&gb); | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
68 c->maxbands = get_bits(&gb, 6); |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
69 if(c->maxbands >= BANDS){ |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
70 av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->maxbands); |
4328 | 71 return -1; |
72 } | |
73 skip_bits(&gb, 88); | |
74 c->gapless = get_bits1(&gb); | |
75 c->lastframelen = get_bits(&gb, 11); | |
76 av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n", | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
77 c->IS, c->MSS, c->gapless, c->lastframelen, c->maxbands); |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
78 c->frames_to_skip = 0; |
4328 | 79 |
80 if(vlc_inited) return 0; | |
81 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); | |
82 if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE, | |
83 &mpc7_scfi[1], 2, 1, | |
84 &mpc7_scfi[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
85 av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n"); | |
86 return -1; | |
87 } | |
88 if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE, | |
89 &mpc7_dscf[1], 2, 1, | |
90 &mpc7_dscf[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
91 av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n"); | |
92 return -1; | |
93 } | |
94 if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE, | |
95 &mpc7_hdr[1], 2, 1, | |
96 &mpc7_hdr[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
97 av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n"); | |
98 return -1; | |
99 } | |
100 for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){ | |
101 for(j = 0; j < 2; j++){ | |
102 if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i], | |
103 &mpc7_quant_vlc[i][j][1], 4, 2, | |
104 &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_STATIC)){ | |
105 av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j); | |
106 return -1; | |
107 } | |
108 } | |
109 } | |
110 vlc_inited = 1; | |
111 return 0; | |
112 } | |
113 | |
114 /** | |
115 * Fill samples for given subband | |
116 */ | |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4536
diff
changeset
|
117 static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst) |
4328 | 118 { |
119 int i, i1, t; | |
120 switch(idx){ | |
121 case -1: | |
122 for(i = 0; i < SAMPLES_PER_BAND; i++){ | |
4536 | 123 *dst++ = (av_random(&c->rnd) & 0x3FC) - 510; |
4328 | 124 } |
4535 | 125 break; |
4328 | 126 case 1: |
127 i1 = get_bits1(gb); | |
128 for(i = 0; i < SAMPLES_PER_BAND/3; i++){ | |
129 t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2); | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
130 *dst++ = mpc7_idx30[t]; |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
131 *dst++ = mpc7_idx31[t]; |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
132 *dst++ = mpc7_idx32[t]; |
4328 | 133 } |
134 break; | |
135 case 2: | |
136 i1 = get_bits1(gb); | |
137 for(i = 0; i < SAMPLES_PER_BAND/2; i++){ | |
138 t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2); | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
139 *dst++ = mpc7_idx50[t]; |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
140 *dst++ = mpc7_idx51[t]; |
4328 | 141 } |
142 break; | |
143 case 3: case 4: case 5: case 6: case 7: | |
144 i1 = get_bits1(gb); | |
145 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
146 *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1]; | |
147 break; | |
148 case 8: case 9: case 10: case 11: case 12: | |
149 case 13: case 14: case 15: case 16: case 17: | |
150 t = (1 << (idx - 2)) - 1; | |
151 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
152 *dst++ = get_bits(gb, idx - 1) - t; | |
153 break; | |
154 default: // case 0 and -2..-17 | |
155 return; | |
156 } | |
157 } | |
158 | |
159 static int mpc7_decode_frame(AVCodecContext * avctx, | |
160 void *data, int *data_size, | |
6218 | 161 const uint8_t * buf, int buf_size) |
4328 | 162 { |
163 MPCContext *c = avctx->priv_data; | |
164 GetBitContext gb; | |
165 uint8_t *bits; | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
166 int i, ch, t; |
4328 | 167 int mb = -1; |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
168 Band *bands = c->bands; |
4328 | 169 int off; |
170 int bits_used, bits_avail; | |
171 | |
172 memset(bands, 0, sizeof(bands)); | |
173 if(buf_size <= 4){ | |
174 av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); | |
175 } | |
176 | |
4347
a188a94e1b61
Buffer for get_bits must be padded because readers may overread.
reimar
parents:
4330
diff
changeset
|
177 bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE); |
6242
67986191913d
Casts to silcence "incompatible pointer type" warnings.
michael
parents:
6218
diff
changeset
|
178 c->dsp.bswap_buf((uint32_t*)bits, (const uint32_t*)(buf + 4), (buf_size - 4) >> 2); |
4328 | 179 init_get_bits(&gb, bits, (buf_size - 4)* 8); |
180 skip_bits(&gb, buf[0]); | |
181 | |
182 /* read subband indexes */ | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
183 for(i = 0; i <= c->maxbands; i++){ |
4328 | 184 for(ch = 0; ch < 2; ch++){ |
185 if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5; | |
186 if(!i || (t == 4)) bands[i].res[ch] = get_bits(&gb, 4); | |
187 else bands[i].res[ch] = bands[i-1].res[ch] + t; | |
188 } | |
189 | |
190 if(bands[i].res[0] || bands[i].res[1]){ | |
191 mb = i; | |
192 if(c->MSS) bands[i].msf = get_bits1(&gb); | |
193 } | |
194 } | |
195 /* get scale indexes coding method */ | |
196 for(i = 0; i <= mb; i++) | |
197 for(ch = 0; ch < 2; ch++) | |
198 if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1); | |
199 /* get scale indexes */ | |
200 for(i = 0; i <= mb; i++){ | |
201 for(ch = 0; ch < 2; ch++){ | |
202 if(bands[i].res[ch]){ | |
203 bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i]; | |
204 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
205 bands[i].scf_idx[ch][0] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][2] + t); | |
206 switch(bands[i].scfi[ch]){ | |
207 case 0: | |
208 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
209 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
210 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
211 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
212 break; | |
213 case 1: | |
214 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
215 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
216 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1]; | |
217 break; | |
218 case 2: | |
219 bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
220 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
221 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
222 break; | |
223 case 3: | |
224 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
225 break; | |
226 } | |
227 c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2]; | |
228 } | |
229 } | |
230 } | |
231 /* get quantizers */ | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
232 memset(c->Q, 0, sizeof(c->Q)); |
4328 | 233 off = 0; |
234 for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND) | |
235 for(ch = 0; ch < 2; ch++) | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
236 idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off); |
4328 | 237 |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
238 ff_mpc_dequantize_and_synth(c, mb, data); |
4328 | 239 |
240 av_free(bits); | |
241 | |
242 bits_used = get_bits_count(&gb); | |
243 bits_avail = (buf_size - 4) * 8; | |
244 if(!buf[1] && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))){ | |
245 av_log(NULL,0, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail); | |
246 return -1; | |
247 } | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
248 if(c->frames_to_skip){ |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
249 c->frames_to_skip--; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
250 *data_size = 0; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
251 return buf_size; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
252 } |
4328 | 253 *data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; |
254 | |
255 return buf_size; | |
256 } | |
257 | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
258 static void mpc7_decode_flush(AVCodecContext *avctx) |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
259 { |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
260 MPCContext *c = avctx->priv_data; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
261 |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
262 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
263 c->frames_to_skip = 32; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
264 } |
4328 | 265 |
266 AVCodec mpc7_decoder = { | |
267 "mpc sv7", | |
268 CODEC_TYPE_AUDIO, | |
269 CODEC_ID_MUSEPACK7, | |
270 sizeof(MPCContext), | |
271 mpc7_decode_init, | |
272 NULL, | |
273 NULL, | |
274 mpc7_decode_frame, | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
275 .flush = mpc7_decode_flush, |
4328 | 276 }; |