Mercurial > libavcodec.hg
annotate mpc8.c @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
author | cehoyos |
---|---|
date | Fri, 20 Feb 2009 16:20:01 +0000 |
parents | e9d9d946f213 |
children | 4e91d96dd045 |
rev | line source |
---|---|
5879 | 1 /* |
2 * Musepack SV8 decoder | |
3 * Copyright (c) 2007 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 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8628
diff
changeset
|
23 * @file libavcodec/mpc8.c Musepack SV8 decoder |
5879 | 24 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples |
25 * divided into 32 subbands. | |
26 */ | |
27 | |
6763 | 28 #include "libavutil/random.h" |
5879 | 29 #include "avcodec.h" |
30 #include "bitstream.h" | |
31 #include "dsputil.h" | |
32 #include "mpegaudio.h" | |
33 | |
34 #include "mpc.h" | |
35 #include "mpcdata.h" | |
36 #include "mpc8data.h" | |
37 #include "mpc8huff.h" | |
38 | |
39 static VLC band_vlc, scfi_vlc[2], dscf_vlc[2], res_vlc[2]; | |
40 static VLC q1_vlc, q2_vlc[2], q3_vlc[2], quant_vlc[4][2], q9up_vlc; | |
41 | |
42 static const int q3_offsets[2] = { MPC8_Q3_OFFSET, MPC8_Q4_OFFSET }; | |
43 static const int quant_offsets[6] = { MPC8_Q5_OFFSET, MPC8_Q6_OFFSET, MPC8_Q7_OFFSET, MPC8_Q8_OFFSET }; | |
44 | |
45 static inline int mpc8_dec_base(GetBitContext *gb, int k, int n) | |
46 { | |
47 int code = get_bits(gb, mpc8_cnk_len[k-1][n-1] - 1); | |
48 | |
49 if (code >= mpc8_cnk_lost[k-1][n-1]) | |
50 code = ((code << 1) | get_bits1(gb)) - mpc8_cnk_lost[k-1][n-1]; | |
51 | |
52 return code; | |
53 } | |
54 | |
55 static inline int mpc8_dec_enum(GetBitContext *gb, int k, int n) | |
56 { | |
57 int bits = 0; | |
58 const uint32_t * C = mpc8_cnk[k-1]; | |
59 int code = mpc8_dec_base(gb, k, n); | |
60 | |
61 do { | |
62 n--; | |
63 if (code >= C[n]) { | |
64 bits |= 1 << n; | |
65 code -= C[n]; | |
66 C -= 32; | |
67 k--; | |
68 } | |
69 } while(k > 0); | |
70 | |
71 return bits; | |
72 } | |
73 | |
74 static inline int mpc8_get_mod_golomb(GetBitContext *gb, int m) | |
75 { | |
76 if(mpc8_cnk_len[0][m] < 1) return 0; | |
77 return mpc8_dec_base(gb, 1, m+1); | |
78 } | |
79 | |
80 static int mpc8_get_mask(GetBitContext *gb, int size, int t) | |
81 { | |
82 int mask = 0; | |
83 | |
84 if(t && t != size) | |
85 mask = mpc8_dec_enum(gb, FFMIN(t, size - t), size); | |
86 if((t << 1) > size) mask = ~mask; | |
87 | |
88 return mask; | |
89 } | |
90 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6350
diff
changeset
|
91 static av_cold int mpc8_decode_init(AVCodecContext * avctx) |
5879 | 92 { |
93 int i; | |
94 MPCContext *c = avctx->priv_data; | |
95 GetBitContext gb; | |
6350 | 96 static int vlc_initialized = 0; |
5879 | 97 |
98 if(avctx->extradata_size < 2){ | |
99 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); | |
100 return -1; | |
101 } | |
102 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); | |
8628
e49a2e1f0020
Replace calls to the deprecated function av_init_random() with
stefano
parents:
8592
diff
changeset
|
103 av_random_init(&c->rnd, 0xDEADBEEF); |
5879 | 104 dsputil_init(&c->dsp, avctx); |
105 | |
106 ff_mpc_init(); | |
107 | |
108 init_get_bits(&gb, avctx->extradata, 16); | |
109 | |
110 skip_bits(&gb, 3);//sample rate | |
111 c->maxbands = get_bits(&gb, 5) + 1; | |
112 skip_bits(&gb, 4);//channels | |
113 c->MSS = get_bits1(&gb); | |
114 c->frames = 1 << (get_bits(&gb, 3) * 2); | |
115 | |
6350 | 116 if(vlc_initialized) return 0; |
5879 | 117 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); |
118 | |
119 init_vlc(&band_vlc, MPC8_BANDS_BITS, MPC8_BANDS_SIZE, | |
120 mpc8_bands_bits, 1, 1, | |
121 mpc8_bands_codes, 1, 1, INIT_VLC_USE_STATIC); | |
122 | |
123 init_vlc(&q1_vlc, MPC8_Q1_BITS, MPC8_Q1_SIZE, | |
124 mpc8_q1_bits, 1, 1, | |
125 mpc8_q1_codes, 1, 1, INIT_VLC_USE_STATIC); | |
126 init_vlc(&q9up_vlc, MPC8_Q9UP_BITS, MPC8_Q9UP_SIZE, | |
127 mpc8_q9up_bits, 1, 1, | |
128 mpc8_q9up_codes, 1, 1, INIT_VLC_USE_STATIC); | |
129 | |
130 init_vlc(&scfi_vlc[0], MPC8_SCFI0_BITS, MPC8_SCFI0_SIZE, | |
131 mpc8_scfi0_bits, 1, 1, | |
132 mpc8_scfi0_codes, 1, 1, INIT_VLC_USE_STATIC); | |
133 init_vlc(&scfi_vlc[1], MPC8_SCFI1_BITS, MPC8_SCFI1_SIZE, | |
134 mpc8_scfi1_bits, 1, 1, | |
135 mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_STATIC); | |
136 | |
137 init_vlc(&dscf_vlc[0], MPC8_DSCF0_BITS, MPC8_DSCF0_SIZE, | |
138 mpc8_dscf0_bits, 1, 1, | |
139 mpc8_dscf0_codes, 1, 1, INIT_VLC_USE_STATIC); | |
140 init_vlc(&dscf_vlc[1], MPC8_DSCF1_BITS, MPC8_DSCF1_SIZE, | |
141 mpc8_dscf1_bits, 1, 1, | |
142 mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_STATIC); | |
143 | |
144 init_vlc_sparse(&q3_vlc[0], MPC8_Q3_BITS, MPC8_Q3_SIZE, | |
145 mpc8_q3_bits, 1, 1, | |
146 mpc8_q3_codes, 1, 1, | |
147 mpc8_q3_syms, 1, 1, INIT_VLC_USE_STATIC); | |
148 init_vlc_sparse(&q3_vlc[1], MPC8_Q4_BITS, MPC8_Q4_SIZE, | |
149 mpc8_q4_bits, 1, 1, | |
150 mpc8_q4_codes, 1, 1, | |
151 mpc8_q4_syms, 1, 1, INIT_VLC_USE_STATIC); | |
152 | |
153 for(i = 0; i < 2; i++){ | |
154 init_vlc(&res_vlc[i], MPC8_RES_BITS, MPC8_RES_SIZE, | |
155 &mpc8_res_bits[i], 1, 1, | |
156 &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_STATIC); | |
157 | |
158 init_vlc(&q2_vlc[i], MPC8_Q2_BITS, MPC8_Q2_SIZE, | |
159 &mpc8_q2_bits[i], 1, 1, | |
160 &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_STATIC); | |
161 | |
162 init_vlc(&quant_vlc[0][i], MPC8_Q5_BITS, MPC8_Q5_SIZE, | |
163 &mpc8_q5_bits[i], 1, 1, | |
164 &mpc8_q5_codes[i], 1, 1, INIT_VLC_USE_STATIC); | |
165 init_vlc(&quant_vlc[1][i], MPC8_Q6_BITS, MPC8_Q6_SIZE, | |
166 &mpc8_q6_bits[i], 1, 1, | |
167 &mpc8_q6_codes[i], 1, 1, INIT_VLC_USE_STATIC); | |
168 init_vlc(&quant_vlc[2][i], MPC8_Q7_BITS, MPC8_Q7_SIZE, | |
169 &mpc8_q7_bits[i], 1, 1, | |
170 &mpc8_q7_codes[i], 1, 1, INIT_VLC_USE_STATIC); | |
171 init_vlc(&quant_vlc[3][i], MPC8_Q8_BITS, MPC8_Q8_SIZE, | |
172 &mpc8_q8_bits[i], 1, 1, | |
173 &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_STATIC); | |
174 } | |
6350 | 175 vlc_initialized = 1; |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7040
diff
changeset
|
176 avctx->sample_fmt = SAMPLE_FMT_S16; |
8174
f11197441364
Add channel layout to several audio decoders I maintain
kostya
parents:
7451
diff
changeset
|
177 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; |
5879 | 178 return 0; |
179 } | |
180 | |
181 static int mpc8_decode_frame(AVCodecContext * avctx, | |
182 void *data, int *data_size, | |
6218 | 183 const uint8_t * buf, int buf_size) |
5879 | 184 { |
185 MPCContext *c = avctx->priv_data; | |
186 GetBitContext gb2, *gb = &gb2; | |
187 int i, j, k, ch, cnt, res, t; | |
188 Band *bands = c->bands; | |
189 int off; | |
190 int maxband, keyframe; | |
191 int last[2]; | |
192 | |
193 keyframe = c->cur_frame == 0; | |
194 | |
195 if(keyframe){ | |
196 memset(c->Q, 0, sizeof(c->Q)); | |
197 c->last_bits_used = 0; | |
198 } | |
199 init_get_bits(gb, buf, buf_size * 8); | |
200 skip_bits(gb, c->last_bits_used & 7); | |
201 | |
202 if(keyframe) | |
203 maxband = mpc8_get_mod_golomb(gb, c->maxbands + 1); | |
204 else{ | |
205 maxband = c->last_max_band + get_vlc2(gb, band_vlc.table, MPC8_BANDS_BITS, 2); | |
206 if(maxband > 32) maxband -= 33; | |
207 } | |
208 c->last_max_band = maxband; | |
209 | |
210 /* read subband indexes */ | |
211 if(maxband){ | |
212 last[0] = last[1] = 0; | |
213 for(i = maxband - 1; i >= 0; i--){ | |
214 for(ch = 0; ch < 2; ch++){ | |
215 last[ch] = get_vlc2(gb, res_vlc[last[ch] > 2].table, MPC8_RES_BITS, 2) + last[ch]; | |
216 if(last[ch] > 15) last[ch] -= 17; | |
217 bands[i].res[ch] = last[ch]; | |
218 } | |
219 } | |
220 if(c->MSS){ | |
221 int mask; | |
222 | |
223 cnt = 0; | |
224 for(i = 0; i < maxband; i++) | |
225 if(bands[i].res[0] || bands[i].res[1]) | |
226 cnt++; | |
227 t = mpc8_get_mod_golomb(gb, cnt); | |
228 mask = mpc8_get_mask(gb, cnt, t); | |
229 for(i = maxband - 1; i >= 0; i--) | |
230 if(bands[i].res[0] || bands[i].res[1]){ | |
231 bands[i].msf = mask & 1; | |
232 mask >>= 1; | |
233 } | |
234 } | |
235 } | |
236 for(i = maxband; i < c->maxbands; i++) | |
237 bands[i].res[0] = bands[i].res[1] = 0; | |
238 | |
239 if(keyframe){ | |
240 for(i = 0; i < 32; i++) | |
241 c->oldDSCF[0][i] = c->oldDSCF[1][i] = 1; | |
242 } | |
243 | |
244 for(i = 0; i < maxband; i++){ | |
245 if(bands[i].res[0] || bands[i].res[1]){ | |
246 cnt = !!bands[i].res[0] + !!bands[i].res[1] - 1; | |
247 if(cnt >= 0){ | |
248 t = get_vlc2(gb, scfi_vlc[cnt].table, scfi_vlc[cnt].bits, 1); | |
249 if(bands[i].res[0]) bands[i].scfi[0] = t >> (2 * cnt); | |
250 if(bands[i].res[1]) bands[i].scfi[1] = t & 3; | |
251 } | |
252 } | |
253 } | |
254 | |
255 for(i = 0; i < maxband; i++){ | |
256 for(ch = 0; ch < 2; ch++){ | |
257 if(!bands[i].res[ch]) continue; | |
258 | |
259 if(c->oldDSCF[ch][i]){ | |
260 bands[i].scf_idx[ch][0] = get_bits(gb, 7) - 6; | |
261 c->oldDSCF[ch][i] = 0; | |
262 }else{ | |
263 t = get_vlc2(gb, dscf_vlc[1].table, MPC8_DSCF1_BITS, 2); | |
264 if(t == 64) | |
265 t += get_bits(gb, 6); | |
266 bands[i].scf_idx[ch][0] = ((bands[i].scf_idx[ch][2] + t - 25) & 0x7F) - 6; | |
267 } | |
268 for(j = 0; j < 2; j++){ | |
269 if((bands[i].scfi[ch] << j) & 2) | |
270 bands[i].scf_idx[ch][j + 1] = bands[i].scf_idx[ch][j]; | |
271 else{ | |
272 t = get_vlc2(gb, dscf_vlc[0].table, MPC8_DSCF0_BITS, 2); | |
273 if(t == 31) | |
274 t = 64 + get_bits(gb, 6); | |
275 bands[i].scf_idx[ch][j + 1] = ((bands[i].scf_idx[ch][j] + t - 25) & 0x7F) - 6; | |
276 } | |
277 } | |
278 } | |
279 } | |
280 | |
281 for(i = 0, off = 0; i < maxband; i++, off += SAMPLES_PER_BAND){ | |
282 for(ch = 0; ch < 2; ch++){ | |
283 res = bands[i].res[ch]; | |
284 switch(res){ | |
285 case -1: | |
286 for(j = 0; j < SAMPLES_PER_BAND; j++) | |
287 c->Q[ch][off + j] = (av_random(&c->rnd) & 0x3FC) - 510; | |
288 break; | |
289 case 0: | |
290 break; | |
291 case 1: | |
292 for(j = 0; j < SAMPLES_PER_BAND; j += SAMPLES_PER_BAND / 2){ | |
293 cnt = get_vlc2(gb, q1_vlc.table, MPC8_Q1_BITS, 2); | |
294 t = mpc8_get_mask(gb, 18, cnt); | |
295 for(k = 0; k < SAMPLES_PER_BAND / 2; k++, t <<= 1) | |
296 c->Q[ch][off + j + k] = (t & 0x20000) ? (get_bits1(gb) << 1) - 1 : 0; | |
297 } | |
298 break; | |
299 case 2: | |
300 cnt = 6;//2*mpc8_thres[res] | |
301 for(j = 0; j < SAMPLES_PER_BAND; j += 3){ | |
302 t = get_vlc2(gb, q2_vlc[cnt > 3].table, MPC8_Q2_BITS, 2); | |
303 c->Q[ch][off + j + 0] = mpc8_idx50[t]; | |
304 c->Q[ch][off + j + 1] = mpc8_idx51[t]; | |
305 c->Q[ch][off + j + 2] = mpc8_idx52[t]; | |
306 cnt = (cnt >> 1) + mpc8_huffq2[t]; | |
307 } | |
308 break; | |
309 case 3: | |
310 case 4: | |
311 for(j = 0; j < SAMPLES_PER_BAND; j += 2){ | |
312 t = get_vlc2(gb, q3_vlc[res - 3].table, MPC8_Q3_BITS, 2) + q3_offsets[res - 3]; | |
313 c->Q[ch][off + j + 1] = t >> 4; | |
314 c->Q[ch][off + j + 0] = (t & 8) ? (t & 0xF) - 16 : (t & 0xF); | |
315 } | |
316 break; | |
317 case 5: | |
318 case 6: | |
319 case 7: | |
320 case 8: | |
321 cnt = 2 * mpc8_thres[res]; | |
322 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
323 t = get_vlc2(gb, quant_vlc[res - 5][cnt > mpc8_thres[res]].table, quant_vlc[res - 5][cnt > mpc8_thres[res]].bits, 2) + quant_offsets[res - 5]; | |
324 c->Q[ch][off + j] = t; | |
325 cnt = (cnt >> 1) + FFABS(c->Q[ch][off + j]); | |
326 } | |
327 break; | |
328 default: | |
329 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
330 c->Q[ch][off + j] = get_vlc2(gb, q9up_vlc.table, MPC8_Q9UP_BITS, 2); | |
331 if(res != 9){ | |
332 c->Q[ch][off + j] <<= res - 9; | |
333 c->Q[ch][off + j] |= get_bits(gb, res - 9); | |
334 } | |
335 c->Q[ch][off + j] -= (1 << (res - 2)) - 1; | |
336 } | |
337 } | |
338 } | |
339 } | |
340 | |
341 ff_mpc_dequantize_and_synth(c, maxband, data); | |
342 | |
343 c->cur_frame++; | |
344 | |
345 c->last_bits_used = get_bits_count(gb); | |
346 if(c->cur_frame >= c->frames) | |
347 c->cur_frame = 0; | |
348 *data_size = MPC_FRAME_SIZE * 4; | |
349 | |
350 return c->cur_frame ? c->last_bits_used >> 3 : buf_size; | |
351 } | |
352 | |
353 AVCodec mpc8_decoder = { | |
6716 | 354 "mpc8", |
5879 | 355 CODEC_TYPE_AUDIO, |
356 CODEC_ID_MUSEPACK8, | |
357 sizeof(MPCContext), | |
358 mpc8_decode_init, | |
359 NULL, | |
360 NULL, | |
361 mpc8_decode_frame, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
362 .long_name = NULL_IF_CONFIG_SMALL("Musepack SV8"), |
5879 | 363 }; |