Mercurial > libavcodec.hg
annotate mpc.c @ 5310:9aa9197034d7 libavcodec
AC-3 decoder, soc revision 40, Aug 9 00:10:14 2006 UTC by cloud9
More code cleanup.
Window is now runtime generated.
Fixed the bugs in rematrixing routine and
in Decoding AC3 Bitstreams when coupling is in use.
Still struggling to find out what affects the quality of
the produced sound. Can anybody have a look at the
imdct routines do_imdct_256 and do_imdct_512 and tell me
whether it is the correctly implemented as described in
standard.
author | jbr |
---|---|
date | Sat, 14 Jul 2007 15:57:51 +0000 |
parents | 2b72f9bc4f06 |
children | 2cc044ac80d4 |
rev | line source |
---|---|
4328 | 1 /* |
2 * Musepack decoder | |
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 /** | |
23 * @file mpc.c Musepack decoder | |
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 | |
38 #include "mpcdata.h" | |
39 | |
40 #define BANDS 32 | |
41 #define SAMPLES_PER_BAND 36 | |
42 #define MPC_FRAME_SIZE (BANDS * SAMPLES_PER_BAND) | |
43 | |
44 static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2]; | |
45 | |
46 static DECLARE_ALIGNED_16(MPA_INT, mpa_window[512]); | |
47 | |
48 typedef struct { | |
49 DSPContext dsp; | |
50 int IS, MSS, gapless; | |
51 int lastframelen, bands; | |
52 int oldDSCF[2][BANDS]; | |
4536 | 53 AVRandomState rnd; |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
54 int frames_to_skip; |
4328 | 55 /* for synthesis */ |
56 DECLARE_ALIGNED_16(MPA_INT, synth_buf[MPA_MAX_CHANNELS][512*2]); | |
57 int synth_buf_offset[MPA_MAX_CHANNELS]; | |
58 DECLARE_ALIGNED_16(int32_t, sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]); | |
59 } MPCContext; | |
60 | |
61 /** Subband structure - hold all variables for each subband */ | |
62 typedef struct { | |
63 int msf; ///< mid-stereo flag | |
64 int res[2]; | |
65 int scfi[2]; | |
66 int scf_idx[2][3]; | |
67 int Q[2]; | |
68 }Band; | |
69 | |
70 static int mpc7_decode_init(AVCodecContext * avctx) | |
71 { | |
72 int i, j; | |
73 MPCContext *c = avctx->priv_data; | |
74 GetBitContext gb; | |
75 uint8_t buf[16]; | |
76 static int vlc_inited = 0; | |
77 | |
78 if(avctx->extradata_size < 16){ | |
79 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); | |
80 return -1; | |
81 } | |
82 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); | |
4536 | 83 av_init_random(0xDEADBEEF, &c->rnd); |
4328 | 84 dsputil_init(&c->dsp, avctx); |
85 c->dsp.bswap_buf(buf, avctx->extradata, 4); | |
86 ff_mpa_synth_init(mpa_window); | |
87 init_get_bits(&gb, buf, 128); | |
88 | |
89 c->IS = get_bits1(&gb); | |
90 c->MSS = get_bits1(&gb); | |
91 c->bands = get_bits(&gb, 6); | |
92 if(c->bands >= BANDS){ | |
93 av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->bands); | |
94 return -1; | |
95 } | |
96 skip_bits(&gb, 88); | |
97 c->gapless = get_bits1(&gb); | |
98 c->lastframelen = get_bits(&gb, 11); | |
99 av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n", | |
100 c->IS, c->MSS, c->gapless, c->lastframelen, c->bands); | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
101 c->frames_to_skip = 0; |
4328 | 102 |
103 if(vlc_inited) return 0; | |
104 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); | |
105 if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE, | |
106 &mpc7_scfi[1], 2, 1, | |
107 &mpc7_scfi[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
108 av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n"); | |
109 return -1; | |
110 } | |
111 if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE, | |
112 &mpc7_dscf[1], 2, 1, | |
113 &mpc7_dscf[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
114 av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n"); | |
115 return -1; | |
116 } | |
117 if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE, | |
118 &mpc7_hdr[1], 2, 1, | |
119 &mpc7_hdr[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
120 av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n"); | |
121 return -1; | |
122 } | |
123 for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){ | |
124 for(j = 0; j < 2; j++){ | |
125 if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i], | |
126 &mpc7_quant_vlc[i][j][1], 4, 2, | |
127 &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_STATIC)){ | |
128 av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j); | |
129 return -1; | |
130 } | |
131 } | |
132 } | |
133 vlc_inited = 1; | |
134 return 0; | |
135 } | |
136 | |
137 /** | |
138 * Process decoded Musepack data and produce PCM | |
139 * @todo make it available for MPC8 and MPC6 | |
140 */ | |
141 static void mpc_synth(MPCContext *c, int16_t *out) | |
142 { | |
143 int dither_state = 0; | |
144 int i, ch; | |
145 OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE], *samples_ptr; | |
146 | |
147 for(ch = 0; ch < 2; ch++){ | |
148 samples_ptr = samples + ch; | |
149 for(i = 0; i < SAMPLES_PER_BAND; i++) { | |
150 ff_mpa_synth_filter(c->synth_buf[ch], &(c->synth_buf_offset[ch]), | |
151 mpa_window, &dither_state, | |
152 samples_ptr, 2, | |
153 c->sb_samples[ch][i]); | |
154 samples_ptr += 64; | |
155 } | |
156 } | |
157 for(i = 0; i < MPC_FRAME_SIZE*2; i++) | |
158 *out++=samples[i]; | |
159 } | |
160 | |
161 /** | |
162 * Fill samples for given subband | |
163 */ | |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4536
diff
changeset
|
164 static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst) |
4328 | 165 { |
166 int i, i1, t; | |
167 switch(idx){ | |
168 case -1: | |
169 for(i = 0; i < SAMPLES_PER_BAND; i++){ | |
4536 | 170 *dst++ = (av_random(&c->rnd) & 0x3FC) - 510; |
4328 | 171 } |
4535 | 172 break; |
4328 | 173 case 1: |
174 i1 = get_bits1(gb); | |
175 for(i = 0; i < SAMPLES_PER_BAND/3; i++){ | |
176 t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2); | |
177 *dst++ = mpc_idx30[t]; | |
178 *dst++ = mpc_idx31[t]; | |
179 *dst++ = mpc_idx32[t]; | |
180 } | |
181 break; | |
182 case 2: | |
183 i1 = get_bits1(gb); | |
184 for(i = 0; i < SAMPLES_PER_BAND/2; i++){ | |
185 t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2); | |
186 *dst++ = mpc_idx50[t]; | |
187 *dst++ = mpc_idx51[t]; | |
188 } | |
189 break; | |
190 case 3: case 4: case 5: case 6: case 7: | |
191 i1 = get_bits1(gb); | |
192 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
193 *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1]; | |
194 break; | |
195 case 8: case 9: case 10: case 11: case 12: | |
196 case 13: case 14: case 15: case 16: case 17: | |
197 t = (1 << (idx - 2)) - 1; | |
198 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
199 *dst++ = get_bits(gb, idx - 1) - t; | |
200 break; | |
201 default: // case 0 and -2..-17 | |
202 return; | |
203 } | |
204 } | |
205 | |
206 static int mpc7_decode_frame(AVCodecContext * avctx, | |
207 void *data, int *data_size, | |
208 uint8_t * buf, int buf_size) | |
209 { | |
210 MPCContext *c = avctx->priv_data; | |
211 GetBitContext gb; | |
212 uint8_t *bits; | |
213 int i, j, ch, t; | |
214 int mb = -1; | |
215 Band bands[BANDS]; | |
216 int Q[2][MPC_FRAME_SIZE]; | |
217 int off; | |
218 float mul; | |
219 int bits_used, bits_avail; | |
220 | |
221 memset(bands, 0, sizeof(bands)); | |
222 if(buf_size <= 4){ | |
223 av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); | |
224 } | |
225 | |
4347
a188a94e1b61
Buffer for get_bits must be padded because readers may overread.
reimar
parents:
4330
diff
changeset
|
226 bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE); |
4328 | 227 c->dsp.bswap_buf(bits, buf + 4, (buf_size - 4) >> 2); |
228 init_get_bits(&gb, bits, (buf_size - 4)* 8); | |
229 skip_bits(&gb, buf[0]); | |
230 | |
231 /* read subband indexes */ | |
232 for(i = 0; i <= c->bands; i++){ | |
233 for(ch = 0; ch < 2; ch++){ | |
234 if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5; | |
235 if(!i || (t == 4)) bands[i].res[ch] = get_bits(&gb, 4); | |
236 else bands[i].res[ch] = bands[i-1].res[ch] + t; | |
237 } | |
238 | |
239 if(bands[i].res[0] || bands[i].res[1]){ | |
240 mb = i; | |
241 if(c->MSS) bands[i].msf = get_bits1(&gb); | |
242 } | |
243 } | |
244 /* get scale indexes coding method */ | |
245 for(i = 0; i <= mb; i++) | |
246 for(ch = 0; ch < 2; ch++) | |
247 if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1); | |
248 /* get scale indexes */ | |
249 for(i = 0; i <= mb; i++){ | |
250 for(ch = 0; ch < 2; ch++){ | |
251 if(bands[i].res[ch]){ | |
252 bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i]; | |
253 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
254 bands[i].scf_idx[ch][0] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][2] + t); | |
255 switch(bands[i].scfi[ch]){ | |
256 case 0: | |
257 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
258 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
259 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
260 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
261 break; | |
262 case 1: | |
263 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
264 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
265 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1]; | |
266 break; | |
267 case 2: | |
268 bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
269 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
270 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
271 break; | |
272 case 3: | |
273 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
274 break; | |
275 } | |
276 c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2]; | |
277 } | |
278 } | |
279 } | |
280 /* get quantizers */ | |
281 memset(Q, 0, sizeof(Q)); | |
282 off = 0; | |
283 for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND) | |
284 for(ch = 0; ch < 2; ch++) | |
285 idx_to_quant(c, &gb, bands[i].res[ch], Q[ch] + off); | |
286 /* dequantize */ | |
287 memset(c->sb_samples, 0, sizeof(c->sb_samples)); | |
288 off = 0; | |
289 for(i = 0; i <= mb; i++, off += SAMPLES_PER_BAND){ | |
290 for(ch = 0; ch < 2; ch++){ | |
291 if(bands[i].res[ch]){ | |
292 j = 0; | |
293 mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][0]]; | |
294 for(; j < 12; j++) | |
295 c->sb_samples[ch][j][i] = mul * Q[ch][j + off]; | |
296 mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][1]]; | |
297 for(; j < 24; j++) | |
298 c->sb_samples[ch][j][i] = mul * Q[ch][j + off]; | |
299 mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][2]]; | |
300 for(; j < 36; j++) | |
301 c->sb_samples[ch][j][i] = mul * Q[ch][j + off]; | |
302 } | |
303 } | |
304 if(bands[i].msf){ | |
305 int t1, t2; | |
306 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
307 t1 = c->sb_samples[0][j][i]; | |
308 t2 = c->sb_samples[1][j][i]; | |
309 c->sb_samples[0][j][i] = t1 + t2; | |
310 c->sb_samples[1][j][i] = t1 - t2; | |
311 } | |
312 } | |
313 } | |
314 | |
315 mpc_synth(c, data); | |
316 | |
317 av_free(bits); | |
318 | |
319 bits_used = get_bits_count(&gb); | |
320 bits_avail = (buf_size - 4) * 8; | |
321 if(!buf[1] && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))){ | |
322 av_log(NULL,0, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail); | |
323 return -1; | |
324 } | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
325 if(c->frames_to_skip){ |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
326 c->frames_to_skip--; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
327 *data_size = 0; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
328 return buf_size; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
329 } |
4328 | 330 *data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; |
331 | |
332 return buf_size; | |
333 } | |
334 | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
335 static void mpc7_decode_flush(AVCodecContext *avctx) |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
336 { |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
337 MPCContext *c = avctx->priv_data; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
338 |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
339 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
340 c->frames_to_skip = 32; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
341 } |
4328 | 342 |
343 AVCodec mpc7_decoder = { | |
344 "mpc sv7", | |
345 CODEC_TYPE_AUDIO, | |
346 CODEC_ID_MUSEPACK7, | |
347 sizeof(MPCContext), | |
348 mpc7_decode_init, | |
349 NULL, | |
350 NULL, | |
351 mpc7_decode_frame, | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
352 .flush = mpc7_decode_flush, |
4328 | 353 }; |