Mercurial > libavcodec.hg
annotate mpc8.c @ 9896:bbefbca72722 libavcodec
Drop code that attempts to decode frames that are prefixed by junk.
Too often it ends up decoding random data into noise without detecting
it (for example after seeking of some MP3 data with oddly often occurring
startcode emulation).
Fixes issue1154.
| author | michael |
|---|---|
| date | Tue, 30 Jun 2009 03:57:27 +0000 |
| parents | d1119c095555 |
| children | 987373501407 |
| 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 | |
|
9153
4e91d96dd045
Make Musepack decoders use LFG pseudorandom generator
kostya
parents:
8718
diff
changeset
|
28 #include "libavutil/lfg.h" |
| 5879 | 29 #include "avcodec.h" |
| 9428 | 30 #include "get_bits.h" |
| 5879 | 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 { | |
|
9849
d1119c095555
Correct reading bits in MPC SV8 base codes (when we have to read 0 or >16 bits).
kostya
parents:
9517
diff
changeset
|
47 int len = mpc8_cnk_len[k-1][n-1] - 1; |
|
d1119c095555
Correct reading bits in MPC SV8 base codes (when we have to read 0 or >16 bits).
kostya
parents:
9517
diff
changeset
|
48 int code = len ? get_bits_long(gb, len) : 0; |
| 5879 | 49 |
| 50 if (code >= mpc8_cnk_lost[k-1][n-1]) | |
| 51 code = ((code << 1) | get_bits1(gb)) - mpc8_cnk_lost[k-1][n-1]; | |
| 52 | |
| 53 return code; | |
| 54 } | |
| 55 | |
| 56 static inline int mpc8_dec_enum(GetBitContext *gb, int k, int n) | |
| 57 { | |
| 58 int bits = 0; | |
| 59 const uint32_t * C = mpc8_cnk[k-1]; | |
| 60 int code = mpc8_dec_base(gb, k, n); | |
| 61 | |
| 62 do { | |
| 63 n--; | |
| 64 if (code >= C[n]) { | |
| 65 bits |= 1 << n; | |
| 66 code -= C[n]; | |
| 67 C -= 32; | |
| 68 k--; | |
| 69 } | |
| 70 } while(k > 0); | |
| 71 | |
| 72 return bits; | |
| 73 } | |
| 74 | |
| 75 static inline int mpc8_get_mod_golomb(GetBitContext *gb, int m) | |
| 76 { | |
| 77 if(mpc8_cnk_len[0][m] < 1) return 0; | |
| 78 return mpc8_dec_base(gb, 1, m+1); | |
| 79 } | |
| 80 | |
| 81 static int mpc8_get_mask(GetBitContext *gb, int size, int t) | |
| 82 { | |
| 83 int mask = 0; | |
| 84 | |
| 85 if(t && t != size) | |
| 86 mask = mpc8_dec_enum(gb, FFMIN(t, size - t), size); | |
| 87 if((t << 1) > size) mask = ~mask; | |
| 88 | |
| 89 return mask; | |
| 90 } | |
| 91 | |
|
9517
dcae1f330498
Compact and make constant two tables used by Musepack decoders
kostya
parents:
9463
diff
changeset
|
92 static const uint16_t vlc_offsets[13] = { |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
93 0, 640, 1184, 1748, 2298, 2426, 2554, 3066, 3578, 4106, 4618, 5196, 5708 |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
94 }; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
95 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6350
diff
changeset
|
96 static av_cold int mpc8_decode_init(AVCodecContext * avctx) |
| 5879 | 97 { |
| 98 int i; | |
| 99 MPCContext *c = avctx->priv_data; | |
| 100 GetBitContext gb; | |
| 6350 | 101 static int vlc_initialized = 0; |
| 5879 | 102 |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
103 static VLC_TYPE band_table[542][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
104 static VLC_TYPE q1_table[520][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
105 static VLC_TYPE q9up_table[524][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
106 static VLC_TYPE scfi0_table[1 << MPC8_SCFI0_BITS][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
107 static VLC_TYPE scfi1_table[1 << MPC8_SCFI1_BITS][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
108 static VLC_TYPE dscf0_table[560][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
109 static VLC_TYPE dscf1_table[598][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
110 static VLC_TYPE q3_0_table[512][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
111 static VLC_TYPE q3_1_table[516][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
112 static VLC_TYPE codes_table[5708][2]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
113 |
| 5879 | 114 if(avctx->extradata_size < 2){ |
| 115 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); | |
| 116 return -1; | |
| 117 } | |
| 118 memset(c->oldDSCF, 0, sizeof(c->oldDSCF)); | |
|
9153
4e91d96dd045
Make Musepack decoders use LFG pseudorandom generator
kostya
parents:
8718
diff
changeset
|
119 av_lfg_init(&c->rnd, 0xDEADBEEF); |
| 5879 | 120 dsputil_init(&c->dsp, avctx); |
| 121 | |
| 122 ff_mpc_init(); | |
| 123 | |
| 124 init_get_bits(&gb, avctx->extradata, 16); | |
| 125 | |
| 126 skip_bits(&gb, 3);//sample rate | |
| 127 c->maxbands = get_bits(&gb, 5) + 1; | |
| 128 skip_bits(&gb, 4);//channels | |
| 129 c->MSS = get_bits1(&gb); | |
| 130 c->frames = 1 << (get_bits(&gb, 3) * 2); | |
| 131 | |
| 6350 | 132 if(vlc_initialized) return 0; |
| 5879 | 133 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); |
| 134 | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
135 band_vlc.table = band_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
136 band_vlc.table_allocated = 542; |
| 5879 | 137 init_vlc(&band_vlc, MPC8_BANDS_BITS, MPC8_BANDS_SIZE, |
| 138 mpc8_bands_bits, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
139 mpc8_bands_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 140 |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
141 q1_vlc.table = q1_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
142 q1_vlc.table_allocated = 520; |
| 5879 | 143 init_vlc(&q1_vlc, MPC8_Q1_BITS, MPC8_Q1_SIZE, |
| 144 mpc8_q1_bits, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
145 mpc8_q1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
146 q9up_vlc.table = q9up_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
147 q9up_vlc.table_allocated = 524; |
| 5879 | 148 init_vlc(&q9up_vlc, MPC8_Q9UP_BITS, MPC8_Q9UP_SIZE, |
| 149 mpc8_q9up_bits, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
150 mpc8_q9up_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 151 |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
152 scfi_vlc[0].table = scfi0_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
153 scfi_vlc[0].table_allocated = 1 << MPC8_SCFI0_BITS; |
| 5879 | 154 init_vlc(&scfi_vlc[0], MPC8_SCFI0_BITS, MPC8_SCFI0_SIZE, |
| 155 mpc8_scfi0_bits, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
156 mpc8_scfi0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
157 scfi_vlc[1].table = scfi1_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
158 scfi_vlc[1].table_allocated = 1 << MPC8_SCFI1_BITS; |
| 5879 | 159 init_vlc(&scfi_vlc[1], MPC8_SCFI1_BITS, MPC8_SCFI1_SIZE, |
| 160 mpc8_scfi1_bits, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
161 mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 162 |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
163 dscf_vlc[0].table = dscf0_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
164 dscf_vlc[0].table_allocated = 560; |
| 5879 | 165 init_vlc(&dscf_vlc[0], MPC8_DSCF0_BITS, MPC8_DSCF0_SIZE, |
| 166 mpc8_dscf0_bits, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
167 mpc8_dscf0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
168 dscf_vlc[1].table = dscf1_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
169 dscf_vlc[1].table_allocated = 598; |
| 5879 | 170 init_vlc(&dscf_vlc[1], MPC8_DSCF1_BITS, MPC8_DSCF1_SIZE, |
| 171 mpc8_dscf1_bits, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
172 mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 173 |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
174 q3_vlc[0].table = q3_0_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
175 q3_vlc[0].table_allocated = 512; |
| 5879 | 176 init_vlc_sparse(&q3_vlc[0], MPC8_Q3_BITS, MPC8_Q3_SIZE, |
| 177 mpc8_q3_bits, 1, 1, | |
| 178 mpc8_q3_codes, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
179 mpc8_q3_syms, 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
180 q3_vlc[1].table = q3_1_table; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
181 q3_vlc[1].table_allocated = 516; |
| 5879 | 182 init_vlc_sparse(&q3_vlc[1], MPC8_Q4_BITS, MPC8_Q4_SIZE, |
| 183 mpc8_q4_bits, 1, 1, | |
| 184 mpc8_q4_codes, 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
185 mpc8_q4_syms, 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 186 |
| 187 for(i = 0; i < 2; i++){ | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
188 res_vlc[i].table = &codes_table[vlc_offsets[0+i]]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
189 res_vlc[i].table_allocated = vlc_offsets[1+i] - vlc_offsets[0+i]; |
| 5879 | 190 init_vlc(&res_vlc[i], MPC8_RES_BITS, MPC8_RES_SIZE, |
| 191 &mpc8_res_bits[i], 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
192 &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 193 |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
194 q2_vlc[i].table = &codes_table[vlc_offsets[2+i]]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
195 q2_vlc[i].table_allocated = vlc_offsets[3+i] - vlc_offsets[2+i]; |
| 5879 | 196 init_vlc(&q2_vlc[i], MPC8_Q2_BITS, MPC8_Q2_SIZE, |
| 197 &mpc8_q2_bits[i], 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
198 &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 199 |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
200 quant_vlc[0][i].table = &codes_table[vlc_offsets[4+i]]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
201 quant_vlc[0][i].table_allocated = vlc_offsets[5+i] - vlc_offsets[4+i]; |
| 5879 | 202 init_vlc(&quant_vlc[0][i], MPC8_Q5_BITS, MPC8_Q5_SIZE, |
| 203 &mpc8_q5_bits[i], 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
204 &mpc8_q5_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
205 quant_vlc[1][i].table = &codes_table[vlc_offsets[6+i]]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
206 quant_vlc[1][i].table_allocated = vlc_offsets[7+i] - vlc_offsets[6+i]; |
| 5879 | 207 init_vlc(&quant_vlc[1][i], MPC8_Q6_BITS, MPC8_Q6_SIZE, |
| 208 &mpc8_q6_bits[i], 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
209 &mpc8_q6_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
210 quant_vlc[2][i].table = &codes_table[vlc_offsets[8+i]]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
211 quant_vlc[2][i].table_allocated = vlc_offsets[9+i] - vlc_offsets[8+i]; |
| 5879 | 212 init_vlc(&quant_vlc[2][i], MPC8_Q7_BITS, MPC8_Q7_SIZE, |
| 213 &mpc8_q7_bits[i], 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
214 &mpc8_q7_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
215 quant_vlc[3][i].table = &codes_table[vlc_offsets[10+i]]; |
|
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
216 quant_vlc[3][i].table_allocated = vlc_offsets[11+i] - vlc_offsets[10+i]; |
| 5879 | 217 init_vlc(&quant_vlc[3][i], MPC8_Q8_BITS, MPC8_Q8_SIZE, |
| 218 &mpc8_q8_bits[i], 1, 1, | |
|
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
219 &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
| 5879 | 220 } |
| 6350 | 221 vlc_initialized = 1; |
|
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7040
diff
changeset
|
222 avctx->sample_fmt = SAMPLE_FMT_S16; |
|
8174
f11197441364
Add channel layout to several audio decoders I maintain
kostya
parents:
7451
diff
changeset
|
223 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; |
| 5879 | 224 return 0; |
| 225 } | |
| 226 | |
| 227 static int mpc8_decode_frame(AVCodecContext * avctx, | |
| 228 void *data, int *data_size, | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9153
diff
changeset
|
229 AVPacket *avpkt) |
| 5879 | 230 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9153
diff
changeset
|
231 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9153
diff
changeset
|
232 int buf_size = avpkt->size; |
| 5879 | 233 MPCContext *c = avctx->priv_data; |
| 234 GetBitContext gb2, *gb = &gb2; | |
| 235 int i, j, k, ch, cnt, res, t; | |
| 236 Band *bands = c->bands; | |
| 237 int off; | |
| 238 int maxband, keyframe; | |
| 239 int last[2]; | |
| 240 | |
| 241 keyframe = c->cur_frame == 0; | |
| 242 | |
| 243 if(keyframe){ | |
| 244 memset(c->Q, 0, sizeof(c->Q)); | |
| 245 c->last_bits_used = 0; | |
| 246 } | |
| 247 init_get_bits(gb, buf, buf_size * 8); | |
| 248 skip_bits(gb, c->last_bits_used & 7); | |
| 249 | |
| 250 if(keyframe) | |
| 251 maxband = mpc8_get_mod_golomb(gb, c->maxbands + 1); | |
| 252 else{ | |
| 253 maxband = c->last_max_band + get_vlc2(gb, band_vlc.table, MPC8_BANDS_BITS, 2); | |
| 254 if(maxband > 32) maxband -= 33; | |
| 255 } | |
| 256 c->last_max_band = maxband; | |
| 257 | |
| 258 /* read subband indexes */ | |
| 259 if(maxband){ | |
| 260 last[0] = last[1] = 0; | |
| 261 for(i = maxband - 1; i >= 0; i--){ | |
| 262 for(ch = 0; ch < 2; ch++){ | |
| 263 last[ch] = get_vlc2(gb, res_vlc[last[ch] > 2].table, MPC8_RES_BITS, 2) + last[ch]; | |
| 264 if(last[ch] > 15) last[ch] -= 17; | |
| 265 bands[i].res[ch] = last[ch]; | |
| 266 } | |
| 267 } | |
| 268 if(c->MSS){ | |
| 269 int mask; | |
| 270 | |
| 271 cnt = 0; | |
| 272 for(i = 0; i < maxband; i++) | |
| 273 if(bands[i].res[0] || bands[i].res[1]) | |
| 274 cnt++; | |
| 275 t = mpc8_get_mod_golomb(gb, cnt); | |
| 276 mask = mpc8_get_mask(gb, cnt, t); | |
| 277 for(i = maxband - 1; i >= 0; i--) | |
| 278 if(bands[i].res[0] || bands[i].res[1]){ | |
| 279 bands[i].msf = mask & 1; | |
| 280 mask >>= 1; | |
| 281 } | |
| 282 } | |
| 283 } | |
| 284 for(i = maxband; i < c->maxbands; i++) | |
| 285 bands[i].res[0] = bands[i].res[1] = 0; | |
| 286 | |
| 287 if(keyframe){ | |
| 288 for(i = 0; i < 32; i++) | |
| 289 c->oldDSCF[0][i] = c->oldDSCF[1][i] = 1; | |
| 290 } | |
| 291 | |
| 292 for(i = 0; i < maxband; i++){ | |
| 293 if(bands[i].res[0] || bands[i].res[1]){ | |
| 294 cnt = !!bands[i].res[0] + !!bands[i].res[1] - 1; | |
| 295 if(cnt >= 0){ | |
| 296 t = get_vlc2(gb, scfi_vlc[cnt].table, scfi_vlc[cnt].bits, 1); | |
| 297 if(bands[i].res[0]) bands[i].scfi[0] = t >> (2 * cnt); | |
| 298 if(bands[i].res[1]) bands[i].scfi[1] = t & 3; | |
| 299 } | |
| 300 } | |
| 301 } | |
| 302 | |
| 303 for(i = 0; i < maxband; i++){ | |
| 304 for(ch = 0; ch < 2; ch++){ | |
| 305 if(!bands[i].res[ch]) continue; | |
| 306 | |
| 307 if(c->oldDSCF[ch][i]){ | |
| 308 bands[i].scf_idx[ch][0] = get_bits(gb, 7) - 6; | |
| 309 c->oldDSCF[ch][i] = 0; | |
| 310 }else{ | |
| 311 t = get_vlc2(gb, dscf_vlc[1].table, MPC8_DSCF1_BITS, 2); | |
| 312 if(t == 64) | |
| 313 t += get_bits(gb, 6); | |
| 314 bands[i].scf_idx[ch][0] = ((bands[i].scf_idx[ch][2] + t - 25) & 0x7F) - 6; | |
| 315 } | |
| 316 for(j = 0; j < 2; j++){ | |
| 317 if((bands[i].scfi[ch] << j) & 2) | |
| 318 bands[i].scf_idx[ch][j + 1] = bands[i].scf_idx[ch][j]; | |
| 319 else{ | |
| 320 t = get_vlc2(gb, dscf_vlc[0].table, MPC8_DSCF0_BITS, 2); | |
| 321 if(t == 31) | |
| 322 t = 64 + get_bits(gb, 6); | |
| 323 bands[i].scf_idx[ch][j + 1] = ((bands[i].scf_idx[ch][j] + t - 25) & 0x7F) - 6; | |
| 324 } | |
| 325 } | |
| 326 } | |
| 327 } | |
| 328 | |
| 329 for(i = 0, off = 0; i < maxband; i++, off += SAMPLES_PER_BAND){ | |
| 330 for(ch = 0; ch < 2; ch++){ | |
| 331 res = bands[i].res[ch]; | |
| 332 switch(res){ | |
| 333 case -1: | |
| 334 for(j = 0; j < SAMPLES_PER_BAND; j++) | |
|
9153
4e91d96dd045
Make Musepack decoders use LFG pseudorandom generator
kostya
parents:
8718
diff
changeset
|
335 c->Q[ch][off + j] = (av_lfg_get(&c->rnd) & 0x3FC) - 510; |
| 5879 | 336 break; |
| 337 case 0: | |
| 338 break; | |
| 339 case 1: | |
| 340 for(j = 0; j < SAMPLES_PER_BAND; j += SAMPLES_PER_BAND / 2){ | |
| 341 cnt = get_vlc2(gb, q1_vlc.table, MPC8_Q1_BITS, 2); | |
| 342 t = mpc8_get_mask(gb, 18, cnt); | |
| 343 for(k = 0; k < SAMPLES_PER_BAND / 2; k++, t <<= 1) | |
| 344 c->Q[ch][off + j + k] = (t & 0x20000) ? (get_bits1(gb) << 1) - 1 : 0; | |
| 345 } | |
| 346 break; | |
| 347 case 2: | |
| 348 cnt = 6;//2*mpc8_thres[res] | |
| 349 for(j = 0; j < SAMPLES_PER_BAND; j += 3){ | |
| 350 t = get_vlc2(gb, q2_vlc[cnt > 3].table, MPC8_Q2_BITS, 2); | |
| 351 c->Q[ch][off + j + 0] = mpc8_idx50[t]; | |
| 352 c->Q[ch][off + j + 1] = mpc8_idx51[t]; | |
| 353 c->Q[ch][off + j + 2] = mpc8_idx52[t]; | |
| 354 cnt = (cnt >> 1) + mpc8_huffq2[t]; | |
| 355 } | |
| 356 break; | |
| 357 case 3: | |
| 358 case 4: | |
| 359 for(j = 0; j < SAMPLES_PER_BAND; j += 2){ | |
| 360 t = get_vlc2(gb, q3_vlc[res - 3].table, MPC8_Q3_BITS, 2) + q3_offsets[res - 3]; | |
| 361 c->Q[ch][off + j + 1] = t >> 4; | |
| 362 c->Q[ch][off + j + 0] = (t & 8) ? (t & 0xF) - 16 : (t & 0xF); | |
| 363 } | |
| 364 break; | |
| 365 case 5: | |
| 366 case 6: | |
| 367 case 7: | |
| 368 case 8: | |
| 369 cnt = 2 * mpc8_thres[res]; | |
| 370 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
| 371 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]; | |
| 372 c->Q[ch][off + j] = t; | |
| 373 cnt = (cnt >> 1) + FFABS(c->Q[ch][off + j]); | |
| 374 } | |
| 375 break; | |
| 376 default: | |
| 377 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
| 378 c->Q[ch][off + j] = get_vlc2(gb, q9up_vlc.table, MPC8_Q9UP_BITS, 2); | |
| 379 if(res != 9){ | |
| 380 c->Q[ch][off + j] <<= res - 9; | |
| 381 c->Q[ch][off + j] |= get_bits(gb, res - 9); | |
| 382 } | |
| 383 c->Q[ch][off + j] -= (1 << (res - 2)) - 1; | |
| 384 } | |
| 385 } | |
| 386 } | |
| 387 } | |
| 388 | |
| 389 ff_mpc_dequantize_and_synth(c, maxband, data); | |
| 390 | |
| 391 c->cur_frame++; | |
| 392 | |
| 393 c->last_bits_used = get_bits_count(gb); | |
| 394 if(c->cur_frame >= c->frames) | |
| 395 c->cur_frame = 0; | |
| 396 *data_size = MPC_FRAME_SIZE * 4; | |
| 397 | |
| 398 return c->cur_frame ? c->last_bits_used >> 3 : buf_size; | |
| 399 } | |
| 400 | |
| 401 AVCodec mpc8_decoder = { | |
| 6716 | 402 "mpc8", |
| 5879 | 403 CODEC_TYPE_AUDIO, |
| 404 CODEC_ID_MUSEPACK8, | |
| 405 sizeof(MPCContext), | |
| 406 mpc8_decode_init, | |
| 407 NULL, | |
| 408 NULL, | |
| 409 mpc8_decode_frame, | |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
410 .long_name = NULL_IF_CONFIG_SMALL("Musepack SV8"), |
| 5879 | 411 }; |
