Mercurial > libavcodec.hg
annotate mpc8.c @ 11104:bb877c9cb102 libavcodec
Detect spatial direct MBs partitioned smaller than 16x16 that can be partitioned
as 16x16 (except ones changing interlacing relative to the colocated MB).
20 cycles slower during MV generation
175 cycles faster during MC
author | michael |
---|---|
date | Mon, 08 Feb 2010 16:23:05 +0000 |
parents | 987373501407 |
children | 8a4984c5cacc |
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 | |
10602 | 132 avctx->sample_fmt = SAMPLE_FMT_S16; |
133 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; | |
134 | |
6350 | 135 if(vlc_initialized) return 0; |
5879 | 136 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); |
137 | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
138 band_vlc.table = band_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
139 band_vlc.table_allocated = 542; |
5879 | 140 init_vlc(&band_vlc, MPC8_BANDS_BITS, MPC8_BANDS_SIZE, |
141 mpc8_bands_bits, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
142 mpc8_bands_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 143 |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
144 q1_vlc.table = q1_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
145 q1_vlc.table_allocated = 520; |
5879 | 146 init_vlc(&q1_vlc, MPC8_Q1_BITS, MPC8_Q1_SIZE, |
147 mpc8_q1_bits, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
148 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
|
149 q9up_vlc.table = q9up_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
150 q9up_vlc.table_allocated = 524; |
5879 | 151 init_vlc(&q9up_vlc, MPC8_Q9UP_BITS, MPC8_Q9UP_SIZE, |
152 mpc8_q9up_bits, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
153 mpc8_q9up_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 154 |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
155 scfi_vlc[0].table = scfi0_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
156 scfi_vlc[0].table_allocated = 1 << MPC8_SCFI0_BITS; |
5879 | 157 init_vlc(&scfi_vlc[0], MPC8_SCFI0_BITS, MPC8_SCFI0_SIZE, |
158 mpc8_scfi0_bits, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
159 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
|
160 scfi_vlc[1].table = scfi1_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
161 scfi_vlc[1].table_allocated = 1 << MPC8_SCFI1_BITS; |
5879 | 162 init_vlc(&scfi_vlc[1], MPC8_SCFI1_BITS, MPC8_SCFI1_SIZE, |
163 mpc8_scfi1_bits, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
164 mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 165 |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
166 dscf_vlc[0].table = dscf0_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
167 dscf_vlc[0].table_allocated = 560; |
5879 | 168 init_vlc(&dscf_vlc[0], MPC8_DSCF0_BITS, MPC8_DSCF0_SIZE, |
169 mpc8_dscf0_bits, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
170 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
|
171 dscf_vlc[1].table = dscf1_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
172 dscf_vlc[1].table_allocated = 598; |
5879 | 173 init_vlc(&dscf_vlc[1], MPC8_DSCF1_BITS, MPC8_DSCF1_SIZE, |
174 mpc8_dscf1_bits, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
175 mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 176 |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
177 q3_vlc[0].table = q3_0_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
178 q3_vlc[0].table_allocated = 512; |
5879 | 179 init_vlc_sparse(&q3_vlc[0], MPC8_Q3_BITS, MPC8_Q3_SIZE, |
180 mpc8_q3_bits, 1, 1, | |
181 mpc8_q3_codes, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
182 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
|
183 q3_vlc[1].table = q3_1_table; |
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
184 q3_vlc[1].table_allocated = 516; |
5879 | 185 init_vlc_sparse(&q3_vlc[1], MPC8_Q4_BITS, MPC8_Q4_SIZE, |
186 mpc8_q4_bits, 1, 1, | |
187 mpc8_q4_codes, 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
188 mpc8_q4_syms, 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 189 |
190 for(i = 0; i < 2; i++){ | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
191 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
|
192 res_vlc[i].table_allocated = vlc_offsets[1+i] - vlc_offsets[0+i]; |
5879 | 193 init_vlc(&res_vlc[i], MPC8_RES_BITS, MPC8_RES_SIZE, |
194 &mpc8_res_bits[i], 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
195 &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 196 |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
197 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
|
198 q2_vlc[i].table_allocated = vlc_offsets[3+i] - vlc_offsets[2+i]; |
5879 | 199 init_vlc(&q2_vlc[i], MPC8_Q2_BITS, MPC8_Q2_SIZE, |
200 &mpc8_q2_bits[i], 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
201 &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 202 |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
203 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
|
204 quant_vlc[0][i].table_allocated = vlc_offsets[5+i] - vlc_offsets[4+i]; |
5879 | 205 init_vlc(&quant_vlc[0][i], MPC8_Q5_BITS, MPC8_Q5_SIZE, |
206 &mpc8_q5_bits[i], 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
207 &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
|
208 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
|
209 quant_vlc[1][i].table_allocated = vlc_offsets[7+i] - vlc_offsets[6+i]; |
5879 | 210 init_vlc(&quant_vlc[1][i], MPC8_Q6_BITS, MPC8_Q6_SIZE, |
211 &mpc8_q6_bits[i], 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
212 &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
|
213 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
|
214 quant_vlc[2][i].table_allocated = vlc_offsets[9+i] - vlc_offsets[8+i]; |
5879 | 215 init_vlc(&quant_vlc[2][i], MPC8_Q7_BITS, MPC8_Q7_SIZE, |
216 &mpc8_q7_bits[i], 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
217 &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
|
218 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
|
219 quant_vlc[3][i].table_allocated = vlc_offsets[11+i] - vlc_offsets[10+i]; |
5879 | 220 init_vlc(&quant_vlc[3][i], MPC8_Q8_BITS, MPC8_Q8_SIZE, |
221 &mpc8_q8_bits[i], 1, 1, | |
9463
d719a2711c64
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
kostya
parents:
9428
diff
changeset
|
222 &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
5879 | 223 } |
6350 | 224 vlc_initialized = 1; |
5879 | 225 return 0; |
226 } | |
227 | |
228 static int mpc8_decode_frame(AVCodecContext * avctx, | |
229 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9153
diff
changeset
|
230 AVPacket *avpkt) |
5879 | 231 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9153
diff
changeset
|
232 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9153
diff
changeset
|
233 int buf_size = avpkt->size; |
5879 | 234 MPCContext *c = avctx->priv_data; |
235 GetBitContext gb2, *gb = &gb2; | |
236 int i, j, k, ch, cnt, res, t; | |
237 Band *bands = c->bands; | |
238 int off; | |
239 int maxband, keyframe; | |
240 int last[2]; | |
241 | |
242 keyframe = c->cur_frame == 0; | |
243 | |
244 if(keyframe){ | |
245 memset(c->Q, 0, sizeof(c->Q)); | |
246 c->last_bits_used = 0; | |
247 } | |
248 init_get_bits(gb, buf, buf_size * 8); | |
249 skip_bits(gb, c->last_bits_used & 7); | |
250 | |
251 if(keyframe) | |
252 maxband = mpc8_get_mod_golomb(gb, c->maxbands + 1); | |
253 else{ | |
254 maxband = c->last_max_band + get_vlc2(gb, band_vlc.table, MPC8_BANDS_BITS, 2); | |
255 if(maxband > 32) maxband -= 33; | |
256 } | |
257 c->last_max_band = maxband; | |
258 | |
259 /* read subband indexes */ | |
260 if(maxband){ | |
261 last[0] = last[1] = 0; | |
262 for(i = maxband - 1; i >= 0; i--){ | |
263 for(ch = 0; ch < 2; ch++){ | |
264 last[ch] = get_vlc2(gb, res_vlc[last[ch] > 2].table, MPC8_RES_BITS, 2) + last[ch]; | |
265 if(last[ch] > 15) last[ch] -= 17; | |
266 bands[i].res[ch] = last[ch]; | |
267 } | |
268 } | |
269 if(c->MSS){ | |
270 int mask; | |
271 | |
272 cnt = 0; | |
273 for(i = 0; i < maxband; i++) | |
274 if(bands[i].res[0] || bands[i].res[1]) | |
275 cnt++; | |
276 t = mpc8_get_mod_golomb(gb, cnt); | |
277 mask = mpc8_get_mask(gb, cnt, t); | |
278 for(i = maxband - 1; i >= 0; i--) | |
279 if(bands[i].res[0] || bands[i].res[1]){ | |
280 bands[i].msf = mask & 1; | |
281 mask >>= 1; | |
282 } | |
283 } | |
284 } | |
285 for(i = maxband; i < c->maxbands; i++) | |
286 bands[i].res[0] = bands[i].res[1] = 0; | |
287 | |
288 if(keyframe){ | |
289 for(i = 0; i < 32; i++) | |
290 c->oldDSCF[0][i] = c->oldDSCF[1][i] = 1; | |
291 } | |
292 | |
293 for(i = 0; i < maxband; i++){ | |
294 if(bands[i].res[0] || bands[i].res[1]){ | |
295 cnt = !!bands[i].res[0] + !!bands[i].res[1] - 1; | |
296 if(cnt >= 0){ | |
297 t = get_vlc2(gb, scfi_vlc[cnt].table, scfi_vlc[cnt].bits, 1); | |
298 if(bands[i].res[0]) bands[i].scfi[0] = t >> (2 * cnt); | |
299 if(bands[i].res[1]) bands[i].scfi[1] = t & 3; | |
300 } | |
301 } | |
302 } | |
303 | |
304 for(i = 0; i < maxband; i++){ | |
305 for(ch = 0; ch < 2; ch++){ | |
306 if(!bands[i].res[ch]) continue; | |
307 | |
308 if(c->oldDSCF[ch][i]){ | |
309 bands[i].scf_idx[ch][0] = get_bits(gb, 7) - 6; | |
310 c->oldDSCF[ch][i] = 0; | |
311 }else{ | |
312 t = get_vlc2(gb, dscf_vlc[1].table, MPC8_DSCF1_BITS, 2); | |
313 if(t == 64) | |
314 t += get_bits(gb, 6); | |
315 bands[i].scf_idx[ch][0] = ((bands[i].scf_idx[ch][2] + t - 25) & 0x7F) - 6; | |
316 } | |
317 for(j = 0; j < 2; j++){ | |
318 if((bands[i].scfi[ch] << j) & 2) | |
319 bands[i].scf_idx[ch][j + 1] = bands[i].scf_idx[ch][j]; | |
320 else{ | |
321 t = get_vlc2(gb, dscf_vlc[0].table, MPC8_DSCF0_BITS, 2); | |
322 if(t == 31) | |
323 t = 64 + get_bits(gb, 6); | |
324 bands[i].scf_idx[ch][j + 1] = ((bands[i].scf_idx[ch][j] + t - 25) & 0x7F) - 6; | |
325 } | |
326 } | |
327 } | |
328 } | |
329 | |
330 for(i = 0, off = 0; i < maxband; i++, off += SAMPLES_PER_BAND){ | |
331 for(ch = 0; ch < 2; ch++){ | |
332 res = bands[i].res[ch]; | |
333 switch(res){ | |
334 case -1: | |
335 for(j = 0; j < SAMPLES_PER_BAND; j++) | |
9153
4e91d96dd045
Make Musepack decoders use LFG pseudorandom generator
kostya
parents:
8718
diff
changeset
|
336 c->Q[ch][off + j] = (av_lfg_get(&c->rnd) & 0x3FC) - 510; |
5879 | 337 break; |
338 case 0: | |
339 break; | |
340 case 1: | |
341 for(j = 0; j < SAMPLES_PER_BAND; j += SAMPLES_PER_BAND / 2){ | |
342 cnt = get_vlc2(gb, q1_vlc.table, MPC8_Q1_BITS, 2); | |
343 t = mpc8_get_mask(gb, 18, cnt); | |
344 for(k = 0; k < SAMPLES_PER_BAND / 2; k++, t <<= 1) | |
345 c->Q[ch][off + j + k] = (t & 0x20000) ? (get_bits1(gb) << 1) - 1 : 0; | |
346 } | |
347 break; | |
348 case 2: | |
349 cnt = 6;//2*mpc8_thres[res] | |
350 for(j = 0; j < SAMPLES_PER_BAND; j += 3){ | |
351 t = get_vlc2(gb, q2_vlc[cnt > 3].table, MPC8_Q2_BITS, 2); | |
352 c->Q[ch][off + j + 0] = mpc8_idx50[t]; | |
353 c->Q[ch][off + j + 1] = mpc8_idx51[t]; | |
354 c->Q[ch][off + j + 2] = mpc8_idx52[t]; | |
355 cnt = (cnt >> 1) + mpc8_huffq2[t]; | |
356 } | |
357 break; | |
358 case 3: | |
359 case 4: | |
360 for(j = 0; j < SAMPLES_PER_BAND; j += 2){ | |
361 t = get_vlc2(gb, q3_vlc[res - 3].table, MPC8_Q3_BITS, 2) + q3_offsets[res - 3]; | |
362 c->Q[ch][off + j + 1] = t >> 4; | |
363 c->Q[ch][off + j + 0] = (t & 8) ? (t & 0xF) - 16 : (t & 0xF); | |
364 } | |
365 break; | |
366 case 5: | |
367 case 6: | |
368 case 7: | |
369 case 8: | |
370 cnt = 2 * mpc8_thres[res]; | |
371 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
372 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]; | |
373 c->Q[ch][off + j] = t; | |
374 cnt = (cnt >> 1) + FFABS(c->Q[ch][off + j]); | |
375 } | |
376 break; | |
377 default: | |
378 for(j = 0; j < SAMPLES_PER_BAND; j++){ | |
379 c->Q[ch][off + j] = get_vlc2(gb, q9up_vlc.table, MPC8_Q9UP_BITS, 2); | |
380 if(res != 9){ | |
381 c->Q[ch][off + j] <<= res - 9; | |
382 c->Q[ch][off + j] |= get_bits(gb, res - 9); | |
383 } | |
384 c->Q[ch][off + j] -= (1 << (res - 2)) - 1; | |
385 } | |
386 } | |
387 } | |
388 } | |
389 | |
390 ff_mpc_dequantize_and_synth(c, maxband, data); | |
391 | |
392 c->cur_frame++; | |
393 | |
394 c->last_bits_used = get_bits_count(gb); | |
395 if(c->cur_frame >= c->frames) | |
396 c->cur_frame = 0; | |
397 *data_size = MPC_FRAME_SIZE * 4; | |
398 | |
399 return c->cur_frame ? c->last_bits_used >> 3 : buf_size; | |
400 } | |
401 | |
402 AVCodec mpc8_decoder = { | |
6716 | 403 "mpc8", |
5879 | 404 CODEC_TYPE_AUDIO, |
405 CODEC_ID_MUSEPACK8, | |
406 sizeof(MPCContext), | |
407 mpc8_decode_init, | |
408 NULL, | |
409 NULL, | |
410 mpc8_decode_frame, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
411 .long_name = NULL_IF_CONFIG_SMALL("Musepack SV8"), |
5879 | 412 }; |