Mercurial > libavcodec.hg
annotate mpc.c @ 4714:fc70a43a4f01 libavcodec
Fix H.264 8x8 transform selection
It seems that it's opt parse bug, it can't process the flags which start by
digit. After change 8x8dct to dct8x8, I can set it without problem. I guess
nobody will use it since it can't work as expected, so the quick fix is change
the option name.
Patch by Limin Wang lance dot lmwang at gmail com
author | mru |
---|---|
date | Sat, 24 Mar 2007 12:07:07 +0000 |
parents | 0430aafe6f01 |
children | 777f250df232 |
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 /** | |
24 * @file mpc.c Musepack decoder | |
25 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples | |
26 * divided into 32 subbands. | |
27 */ | |
28 | |
29 #include "avcodec.h" | |
30 #include "bitstream.h" | |
31 #include "dsputil.h" | |
4536 | 32 #include "random.h" |
4328 | 33 |
34 #ifdef CONFIG_MPEGAUDIO_HP | |
35 #define USE_HIGHPRECISION | |
36 #endif | |
37 #include "mpegaudio.h" | |
38 | |
39 #include "mpcdata.h" | |
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 DECLARE_ALIGNED_16(MPA_INT, mpa_window[512]); | |
48 | |
49 typedef struct { | |
50 DSPContext dsp; | |
51 int IS, MSS, gapless; | |
52 int lastframelen, bands; | |
53 int oldDSCF[2][BANDS]; | |
4536 | 54 AVRandomState rnd; |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
55 int frames_to_skip; |
4328 | 56 /* for synthesis */ |
57 DECLARE_ALIGNED_16(MPA_INT, synth_buf[MPA_MAX_CHANNELS][512*2]); | |
58 int synth_buf_offset[MPA_MAX_CHANNELS]; | |
59 DECLARE_ALIGNED_16(int32_t, sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]); | |
60 } MPCContext; | |
61 | |
62 /** Subband structure - hold all variables for each subband */ | |
63 typedef struct { | |
64 int msf; ///< mid-stereo flag | |
65 int res[2]; | |
66 int scfi[2]; | |
67 int scf_idx[2][3]; | |
68 int Q[2]; | |
69 }Band; | |
70 | |
71 static int mpc7_decode_init(AVCodecContext * avctx) | |
72 { | |
73 int i, j; | |
74 MPCContext *c = avctx->priv_data; | |
75 GetBitContext gb; | |
76 uint8_t buf[16]; | |
77 float f1=1.20050805774840750476 * 256; | |
78 static int vlc_inited = 0; | |
79 | |
80 if(avctx->extradata_size < 16){ | |
81 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); | |
82 return -1; | |
83 } | |
84 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); | |
4536 | 85 av_init_random(0xDEADBEEF, &c->rnd); |
4328 | 86 dsputil_init(&c->dsp, avctx); |
87 c->dsp.bswap_buf(buf, avctx->extradata, 4); | |
88 ff_mpa_synth_init(mpa_window); | |
89 init_get_bits(&gb, buf, 128); | |
90 | |
91 c->IS = get_bits1(&gb); | |
92 c->MSS = get_bits1(&gb); | |
93 c->bands = get_bits(&gb, 6); | |
94 if(c->bands >= BANDS){ | |
95 av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->bands); | |
96 return -1; | |
97 } | |
98 skip_bits(&gb, 88); | |
99 c->gapless = get_bits1(&gb); | |
100 c->lastframelen = get_bits(&gb, 11); | |
101 av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n", | |
102 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
|
103 c->frames_to_skip = 0; |
4328 | 104 |
105 if(vlc_inited) return 0; | |
106 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); | |
107 if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE, | |
108 &mpc7_scfi[1], 2, 1, | |
109 &mpc7_scfi[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
110 av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n"); | |
111 return -1; | |
112 } | |
113 if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE, | |
114 &mpc7_dscf[1], 2, 1, | |
115 &mpc7_dscf[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
116 av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n"); | |
117 return -1; | |
118 } | |
119 if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE, | |
120 &mpc7_hdr[1], 2, 1, | |
121 &mpc7_hdr[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
122 av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n"); | |
123 return -1; | |
124 } | |
125 for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){ | |
126 for(j = 0; j < 2; j++){ | |
127 if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i], | |
128 &mpc7_quant_vlc[i][j][1], 4, 2, | |
129 &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_STATIC)){ | |
130 av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j); | |
131 return -1; | |
132 } | |
133 } | |
134 } | |
135 vlc_inited = 1; | |
136 return 0; | |
137 } | |
138 | |
139 /** | |
140 * Process decoded Musepack data and produce PCM | |
141 * @todo make it available for MPC8 and MPC6 | |
142 */ | |
143 static void mpc_synth(MPCContext *c, int16_t *out) | |
144 { | |
145 int dither_state = 0; | |
146 int i, ch; | |
147 OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE], *samples_ptr; | |
148 | |
149 for(ch = 0; ch < 2; ch++){ | |
150 samples_ptr = samples + ch; | |
151 for(i = 0; i < SAMPLES_PER_BAND; i++) { | |
152 ff_mpa_synth_filter(c->synth_buf[ch], &(c->synth_buf_offset[ch]), | |
153 mpa_window, &dither_state, | |
154 samples_ptr, 2, | |
155 c->sb_samples[ch][i]); | |
156 samples_ptr += 64; | |
157 } | |
158 } | |
159 for(i = 0; i < MPC_FRAME_SIZE*2; i++) | |
160 *out++=samples[i]; | |
161 } | |
162 | |
163 /** | |
164 * Fill samples for given subband | |
165 */ | |
166 static void inline idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst) | |
167 { | |
168 int i, i1, t; | |
169 switch(idx){ | |
170 case -1: | |
171 for(i = 0; i < SAMPLES_PER_BAND; i++){ | |
4536 | 172 *dst++ = (av_random(&c->rnd) & 0x3FC) - 510; |
4328 | 173 } |
4535 | 174 break; |
4328 | 175 case 1: |
176 i1 = get_bits1(gb); | |
177 for(i = 0; i < SAMPLES_PER_BAND/3; i++){ | |
178 t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2); | |
179 *dst++ = mpc_idx30[t]; | |
180 *dst++ = mpc_idx31[t]; | |
181 *dst++ = mpc_idx32[t]; | |
182 } | |
183 break; | |
184 case 2: | |
185 i1 = get_bits1(gb); | |
186 for(i = 0; i < SAMPLES_PER_BAND/2; i++){ | |
187 t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2); | |
188 *dst++ = mpc_idx50[t]; | |
189 *dst++ = mpc_idx51[t]; | |
190 } | |
191 break; | |
192 case 3: case 4: case 5: case 6: case 7: | |
193 i1 = get_bits1(gb); | |
194 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
195 *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1]; | |
196 break; | |
197 case 8: case 9: case 10: case 11: case 12: | |
198 case 13: case 14: case 15: case 16: case 17: | |
199 t = (1 << (idx - 2)) - 1; | |
200 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
201 *dst++ = get_bits(gb, idx - 1) - t; | |
202 break; | |
203 default: // case 0 and -2..-17 | |
204 return; | |
205 } | |
206 } | |
207 | |
208 static int mpc7_decode_frame(AVCodecContext * avctx, | |
209 void *data, int *data_size, | |
210 uint8_t * buf, int buf_size) | |
211 { | |
212 MPCContext *c = avctx->priv_data; | |
213 GetBitContext gb; | |
214 uint8_t *bits; | |
215 int i, j, ch, t; | |
216 int mb = -1; | |
217 Band bands[BANDS]; | |
218 int Q[2][MPC_FRAME_SIZE]; | |
219 int off; | |
220 float mul; | |
221 int bits_used, bits_avail; | |
222 | |
223 memset(bands, 0, sizeof(bands)); | |
224 if(buf_size <= 4){ | |
225 av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); | |
226 } | |
227 | |
4347
a188a94e1b61
Buffer for get_bits must be padded because readers may overread.
reimar
parents:
4330
diff
changeset
|
228 bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE); |
4328 | 229 c->dsp.bswap_buf(bits, buf + 4, (buf_size - 4) >> 2); |
230 init_get_bits(&gb, bits, (buf_size - 4)* 8); | |
231 skip_bits(&gb, buf[0]); | |
232 | |
233 /* read subband indexes */ | |
234 for(i = 0; i <= c->bands; i++){ | |
235 for(ch = 0; ch < 2; ch++){ | |
236 if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5; | |
237 if(!i || (t == 4)) bands[i].res[ch] = get_bits(&gb, 4); | |
238 else bands[i].res[ch] = bands[i-1].res[ch] + t; | |
239 } | |
240 | |
241 if(bands[i].res[0] || bands[i].res[1]){ | |
242 mb = i; | |
243 if(c->MSS) bands[i].msf = get_bits1(&gb); | |
244 } | |
245 } | |
246 /* get scale indexes coding method */ | |
247 for(i = 0; i <= mb; i++) | |
248 for(ch = 0; ch < 2; ch++) | |
249 if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1); | |
250 /* get scale indexes */ | |
251 for(i = 0; i <= mb; i++){ | |
252 for(ch = 0; ch < 2; ch++){ | |
253 if(bands[i].res[ch]){ | |
254 bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i]; | |
255 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
256 bands[i].scf_idx[ch][0] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][2] + t); | |
257 switch(bands[i].scfi[ch]){ | |
258 case 0: | |
259 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
260 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
261 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
262 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
263 break; | |
264 case 1: | |
265 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
266 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
267 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1]; | |
268 break; | |
269 case 2: | |
270 bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
271 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
272 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
273 break; | |
274 case 3: | |
275 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
276 break; | |
277 } | |
278 c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2]; | |
279 } | |
280 } | |
281 } | |
282 /* get quantizers */ | |
283 memset(Q, 0, sizeof(Q)); | |
284 off = 0; | |
285 for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND) | |
286 for(ch = 0; ch < 2; ch++) | |
287 idx_to_quant(c, &gb, bands[i].res[ch], Q[ch] + off); | |
288 /* dequantize */ | |
289 memset(c->sb_samples, 0, sizeof(c->sb_samples)); | |
290 off = 0; | |
291 for(i = 0; i <= mb; i++, off += SAMPLES_PER_BAND){ | |
292 for(ch = 0; ch < 2; ch++){ | |
293 if(bands[i].res[ch]){ | |
294 j = 0; | |
295 mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][0]]; | |
296 for(; j < 12; j++) | |
297 c->sb_samples[ch][j][i] = mul * Q[ch][j + off]; | |
298 mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][1]]; | |
299 for(; j < 24; j++) | |
300 c->sb_samples[ch][j][i] = mul * Q[ch][j + off]; | |
301 mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][2]]; | |
302 for(; j < 36; j++) | |
303 c->sb_samples[ch][j][i] = mul * Q[ch][j + off]; | |
304 } | |
305 } | |
306 if(bands[i].msf){ | |
307 int t1, t2; | |
308 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
309 t1 = c->sb_samples[0][j][i]; | |
310 t2 = c->sb_samples[1][j][i]; | |
311 c->sb_samples[0][j][i] = t1 + t2; | |
312 c->sb_samples[1][j][i] = t1 - t2; | |
313 } | |
314 } | |
315 } | |
316 | |
317 mpc_synth(c, data); | |
318 | |
319 av_free(bits); | |
320 | |
321 bits_used = get_bits_count(&gb); | |
322 bits_avail = (buf_size - 4) * 8; | |
323 if(!buf[1] && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))){ | |
324 av_log(NULL,0, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail); | |
325 return -1; | |
326 } | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
327 if(c->frames_to_skip){ |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
328 c->frames_to_skip--; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
329 *data_size = 0; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
330 return buf_size; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
331 } |
4328 | 332 *data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; |
333 | |
334 return buf_size; | |
335 } | |
336 | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
337 static void mpc7_decode_flush(AVCodecContext *avctx) |
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 MPCContext *c = avctx->priv_data; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
340 |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
341 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
342 c->frames_to_skip = 32; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
343 } |
4328 | 344 |
345 AVCodec mpc7_decoder = { | |
346 "mpc sv7", | |
347 CODEC_TYPE_AUDIO, | |
348 CODEC_ID_MUSEPACK7, | |
349 sizeof(MPCContext), | |
350 mpc7_decode_init, | |
351 NULL, | |
352 NULL, | |
353 mpc7_decode_frame, | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
354 .flush = mpc7_decode_flush, |
4328 | 355 }; |