Mercurial > libavcodec.hg
annotate mpc7.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 |
---|---|
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 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8628
diff
changeset
|
23 * @file libavcodec/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 | |
6763 | 28 #include "libavutil/random.h" |
4328 | 29 #include "avcodec.h" |
30 #include "bitstream.h" | |
31 #include "dsputil.h" | |
32 #include "mpegaudio.h" | |
33 | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
34 #include "mpc.h" |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
35 #include "mpc7data.h" |
4328 | 36 |
37 #define BANDS 32 | |
38 #define SAMPLES_PER_BAND 36 | |
39 #define MPC_FRAME_SIZE (BANDS * SAMPLES_PER_BAND) | |
40 | |
41 static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2]; | |
42 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6350
diff
changeset
|
43 static av_cold int mpc7_decode_init(AVCodecContext * avctx) |
4328 | 44 { |
45 int i, j; | |
46 MPCContext *c = avctx->priv_data; | |
47 GetBitContext gb; | |
48 uint8_t buf[16]; | |
6350 | 49 static int vlc_initialized = 0; |
4328 | 50 |
51 if(avctx->extradata_size < 16){ | |
52 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); | |
53 return -1; | |
54 } | |
55 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); | |
8628
e49a2e1f0020
Replace calls to the deprecated function av_init_random() with
stefano
parents:
8592
diff
changeset
|
56 av_random_init(&c->rnd, 0xDEADBEEF); |
4328 | 57 dsputil_init(&c->dsp, avctx); |
6242
67986191913d
Casts to silcence "incompatible pointer type" warnings.
michael
parents:
6218
diff
changeset
|
58 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
|
59 ff_mpc_init(); |
4328 | 60 init_get_bits(&gb, buf, 128); |
61 | |
62 c->IS = get_bits1(&gb); | |
63 c->MSS = get_bits1(&gb); | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
64 c->maxbands = get_bits(&gb, 6); |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
65 if(c->maxbands >= BANDS){ |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
66 av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->maxbands); |
4328 | 67 return -1; |
68 } | |
69 skip_bits(&gb, 88); | |
70 c->gapless = get_bits1(&gb); | |
71 c->lastframelen = get_bits(&gb, 11); | |
72 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
|
73 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
|
74 c->frames_to_skip = 0; |
4328 | 75 |
6350 | 76 if(vlc_initialized) return 0; |
4328 | 77 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); |
78 if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE, | |
79 &mpc7_scfi[1], 2, 1, | |
80 &mpc7_scfi[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
81 av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n"); | |
82 return -1; | |
83 } | |
84 if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE, | |
85 &mpc7_dscf[1], 2, 1, | |
86 &mpc7_dscf[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
87 av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n"); | |
88 return -1; | |
89 } | |
90 if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE, | |
91 &mpc7_hdr[1], 2, 1, | |
92 &mpc7_hdr[0], 2, 1, INIT_VLC_USE_STATIC)){ | |
93 av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n"); | |
94 return -1; | |
95 } | |
96 for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){ | |
97 for(j = 0; j < 2; j++){ | |
98 if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i], | |
99 &mpc7_quant_vlc[i][j][1], 4, 2, | |
100 &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_STATIC)){ | |
101 av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j); | |
102 return -1; | |
103 } | |
104 } | |
105 } | |
6350 | 106 vlc_initialized = 1; |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7040
diff
changeset
|
107 avctx->sample_fmt = SAMPLE_FMT_S16; |
8174
f11197441364
Add channel layout to several audio decoders I maintain
kostya
parents:
7451
diff
changeset
|
108 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; |
4328 | 109 return 0; |
110 } | |
111 | |
112 /** | |
113 * Fill samples for given subband | |
114 */ | |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4536
diff
changeset
|
115 static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst) |
4328 | 116 { |
117 int i, i1, t; | |
118 switch(idx){ | |
119 case -1: | |
120 for(i = 0; i < SAMPLES_PER_BAND; i++){ | |
4536 | 121 *dst++ = (av_random(&c->rnd) & 0x3FC) - 510; |
4328 | 122 } |
4535 | 123 break; |
4328 | 124 case 1: |
125 i1 = get_bits1(gb); | |
126 for(i = 0; i < SAMPLES_PER_BAND/3; i++){ | |
127 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
|
128 *dst++ = mpc7_idx30[t]; |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
129 *dst++ = mpc7_idx31[t]; |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
130 *dst++ = mpc7_idx32[t]; |
4328 | 131 } |
132 break; | |
133 case 2: | |
134 i1 = get_bits1(gb); | |
135 for(i = 0; i < SAMPLES_PER_BAND/2; i++){ | |
136 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
|
137 *dst++ = mpc7_idx50[t]; |
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
138 *dst++ = mpc7_idx51[t]; |
4328 | 139 } |
140 break; | |
141 case 3: case 4: case 5: case 6: case 7: | |
142 i1 = get_bits1(gb); | |
143 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
144 *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1]; | |
145 break; | |
146 case 8: case 9: case 10: case 11: case 12: | |
147 case 13: case 14: case 15: case 16: case 17: | |
148 t = (1 << (idx - 2)) - 1; | |
149 for(i = 0; i < SAMPLES_PER_BAND; i++) | |
150 *dst++ = get_bits(gb, idx - 1) - t; | |
151 break; | |
152 default: // case 0 and -2..-17 | |
153 return; | |
154 } | |
155 } | |
156 | |
157 static int mpc7_decode_frame(AVCodecContext * avctx, | |
158 void *data, int *data_size, | |
6218 | 159 const uint8_t * buf, int buf_size) |
4328 | 160 { |
161 MPCContext *c = avctx->priv_data; | |
162 GetBitContext gb; | |
163 uint8_t *bits; | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
164 int i, ch, t; |
4328 | 165 int mb = -1; |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
166 Band *bands = c->bands; |
4328 | 167 int off; |
168 int bits_used, bits_avail; | |
169 | |
170 memset(bands, 0, sizeof(bands)); | |
171 if(buf_size <= 4){ | |
172 av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size); | |
173 } | |
174 | |
4347
a188a94e1b61
Buffer for get_bits must be padded because readers may overread.
reimar
parents:
4330
diff
changeset
|
175 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
|
176 c->dsp.bswap_buf((uint32_t*)bits, (const uint32_t*)(buf + 4), (buf_size - 4) >> 2); |
4328 | 177 init_get_bits(&gb, bits, (buf_size - 4)* 8); |
178 skip_bits(&gb, buf[0]); | |
179 | |
180 /* read subband indexes */ | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
181 for(i = 0; i <= c->maxbands; i++){ |
4328 | 182 for(ch = 0; ch < 2; ch++){ |
183 if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5; | |
184 if(!i || (t == 4)) bands[i].res[ch] = get_bits(&gb, 4); | |
185 else bands[i].res[ch] = bands[i-1].res[ch] + t; | |
186 } | |
187 | |
188 if(bands[i].res[0] || bands[i].res[1]){ | |
189 mb = i; | |
190 if(c->MSS) bands[i].msf = get_bits1(&gb); | |
191 } | |
192 } | |
193 /* get scale indexes coding method */ | |
194 for(i = 0; i <= mb; i++) | |
195 for(ch = 0; ch < 2; ch++) | |
196 if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1); | |
197 /* get scale indexes */ | |
198 for(i = 0; i <= mb; i++){ | |
199 for(ch = 0; ch < 2; ch++){ | |
200 if(bands[i].res[ch]){ | |
201 bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i]; | |
202 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
203 bands[i].scf_idx[ch][0] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][2] + t); | |
204 switch(bands[i].scfi[ch]){ | |
205 case 0: | |
206 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
207 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
208 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
209 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
210 break; | |
211 case 1: | |
212 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
213 bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); | |
214 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1]; | |
215 break; | |
216 case 2: | |
217 bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
218 t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | |
219 bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); | |
220 break; | |
221 case 3: | |
222 bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; | |
223 break; | |
224 } | |
225 c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2]; | |
226 } | |
227 } | |
228 } | |
229 /* get quantizers */ | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
230 memset(c->Q, 0, sizeof(c->Q)); |
4328 | 231 off = 0; |
232 for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND) | |
233 for(ch = 0; ch < 2; ch++) | |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
234 idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off); |
4328 | 235 |
5868
2cc044ac80d4
Split Musepack decoder into SV7 decoder and synth core
kostya
parents:
5215
diff
changeset
|
236 ff_mpc_dequantize_and_synth(c, mb, data); |
4328 | 237 |
238 av_free(bits); | |
239 | |
240 bits_used = get_bits_count(&gb); | |
241 bits_avail = (buf_size - 4) * 8; | |
242 if(!buf[1] && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))){ | |
243 av_log(NULL,0, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail); | |
244 return -1; | |
245 } | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
246 if(c->frames_to_skip){ |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
247 c->frames_to_skip--; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
248 *data_size = 0; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
249 return buf_size; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
250 } |
4328 | 251 *data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4; |
252 | |
253 return buf_size; | |
254 } | |
255 | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
256 static void mpc7_decode_flush(AVCodecContext *avctx) |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
257 { |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
258 MPCContext *c = avctx->priv_data; |
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 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
261 c->frames_to_skip = 32; |
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
262 } |
4328 | 263 |
264 AVCodec mpc7_decoder = { | |
6716 | 265 "mpc7", |
4328 | 266 CODEC_TYPE_AUDIO, |
267 CODEC_ID_MUSEPACK7, | |
268 sizeof(MPCContext), | |
269 mpc7_decode_init, | |
270 NULL, | |
271 NULL, | |
272 mpc7_decode_frame, | |
4330
0663caaf573c
Decode previous 32 frames to avoid seeking artifacts in MPC
kostya
parents:
4328
diff
changeset
|
273 .flush = mpc7_decode_flush, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
274 .long_name = NULL_IF_CONFIG_SMALL("Musepack SV7"), |
4328 | 275 }; |