Mercurial > libavcodec.hg
comparison mpc8.c @ 9463:d719a2711c64 libavcodec
Use new static VLC scheme in Indeo2, Musepack and WNV1 decoders
author | kostya |
---|---|
date | Fri, 17 Apr 2009 14:09:56 +0000 |
parents | 0dce4fe6e6f3 |
children | dcae1f330498 |
comparison
equal
deleted
inserted
replaced
9462:ab2daba3e200 | 9463:d719a2711c64 |
---|---|
86 if((t << 1) > size) mask = ~mask; | 86 if((t << 1) > size) mask = ~mask; |
87 | 87 |
88 return mask; | 88 return mask; |
89 } | 89 } |
90 | 90 |
91 static int vlc_offsets[13] = { | |
92 0, 640, 1184, 1748, 2298, 2426, 2554, 3066, 3578, 4106, 4618, 5196, 5708 | |
93 }; | |
94 | |
91 static av_cold int mpc8_decode_init(AVCodecContext * avctx) | 95 static av_cold int mpc8_decode_init(AVCodecContext * avctx) |
92 { | 96 { |
93 int i; | 97 int i; |
94 MPCContext *c = avctx->priv_data; | 98 MPCContext *c = avctx->priv_data; |
95 GetBitContext gb; | 99 GetBitContext gb; |
96 static int vlc_initialized = 0; | 100 static int vlc_initialized = 0; |
101 | |
102 static VLC_TYPE band_table[542][2]; | |
103 static VLC_TYPE q1_table[520][2]; | |
104 static VLC_TYPE q9up_table[524][2]; | |
105 static VLC_TYPE scfi0_table[1 << MPC8_SCFI0_BITS][2]; | |
106 static VLC_TYPE scfi1_table[1 << MPC8_SCFI1_BITS][2]; | |
107 static VLC_TYPE dscf0_table[560][2]; | |
108 static VLC_TYPE dscf1_table[598][2]; | |
109 static VLC_TYPE q3_0_table[512][2]; | |
110 static VLC_TYPE q3_1_table[516][2]; | |
111 static VLC_TYPE codes_table[5708][2]; | |
97 | 112 |
98 if(avctx->extradata_size < 2){ | 113 if(avctx->extradata_size < 2){ |
99 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); | 114 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size); |
100 return -1; | 115 return -1; |
101 } | 116 } |
114 c->frames = 1 << (get_bits(&gb, 3) * 2); | 129 c->frames = 1 << (get_bits(&gb, 3) * 2); |
115 | 130 |
116 if(vlc_initialized) return 0; | 131 if(vlc_initialized) return 0; |
117 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); | 132 av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n"); |
118 | 133 |
134 band_vlc.table = band_table; | |
135 band_vlc.table_allocated = 542; | |
119 init_vlc(&band_vlc, MPC8_BANDS_BITS, MPC8_BANDS_SIZE, | 136 init_vlc(&band_vlc, MPC8_BANDS_BITS, MPC8_BANDS_SIZE, |
120 mpc8_bands_bits, 1, 1, | 137 mpc8_bands_bits, 1, 1, |
121 mpc8_bands_codes, 1, 1, INIT_VLC_USE_STATIC); | 138 mpc8_bands_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
122 | 139 |
140 q1_vlc.table = q1_table; | |
141 q1_vlc.table_allocated = 520; | |
123 init_vlc(&q1_vlc, MPC8_Q1_BITS, MPC8_Q1_SIZE, | 142 init_vlc(&q1_vlc, MPC8_Q1_BITS, MPC8_Q1_SIZE, |
124 mpc8_q1_bits, 1, 1, | 143 mpc8_q1_bits, 1, 1, |
125 mpc8_q1_codes, 1, 1, INIT_VLC_USE_STATIC); | 144 mpc8_q1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
145 q9up_vlc.table = q9up_table; | |
146 q9up_vlc.table_allocated = 524; | |
126 init_vlc(&q9up_vlc, MPC8_Q9UP_BITS, MPC8_Q9UP_SIZE, | 147 init_vlc(&q9up_vlc, MPC8_Q9UP_BITS, MPC8_Q9UP_SIZE, |
127 mpc8_q9up_bits, 1, 1, | 148 mpc8_q9up_bits, 1, 1, |
128 mpc8_q9up_codes, 1, 1, INIT_VLC_USE_STATIC); | 149 mpc8_q9up_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
129 | 150 |
151 scfi_vlc[0].table = scfi0_table; | |
152 scfi_vlc[0].table_allocated = 1 << MPC8_SCFI0_BITS; | |
130 init_vlc(&scfi_vlc[0], MPC8_SCFI0_BITS, MPC8_SCFI0_SIZE, | 153 init_vlc(&scfi_vlc[0], MPC8_SCFI0_BITS, MPC8_SCFI0_SIZE, |
131 mpc8_scfi0_bits, 1, 1, | 154 mpc8_scfi0_bits, 1, 1, |
132 mpc8_scfi0_codes, 1, 1, INIT_VLC_USE_STATIC); | 155 mpc8_scfi0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
156 scfi_vlc[1].table = scfi1_table; | |
157 scfi_vlc[1].table_allocated = 1 << MPC8_SCFI1_BITS; | |
133 init_vlc(&scfi_vlc[1], MPC8_SCFI1_BITS, MPC8_SCFI1_SIZE, | 158 init_vlc(&scfi_vlc[1], MPC8_SCFI1_BITS, MPC8_SCFI1_SIZE, |
134 mpc8_scfi1_bits, 1, 1, | 159 mpc8_scfi1_bits, 1, 1, |
135 mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_STATIC); | 160 mpc8_scfi1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
136 | 161 |
162 dscf_vlc[0].table = dscf0_table; | |
163 dscf_vlc[0].table_allocated = 560; | |
137 init_vlc(&dscf_vlc[0], MPC8_DSCF0_BITS, MPC8_DSCF0_SIZE, | 164 init_vlc(&dscf_vlc[0], MPC8_DSCF0_BITS, MPC8_DSCF0_SIZE, |
138 mpc8_dscf0_bits, 1, 1, | 165 mpc8_dscf0_bits, 1, 1, |
139 mpc8_dscf0_codes, 1, 1, INIT_VLC_USE_STATIC); | 166 mpc8_dscf0_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
167 dscf_vlc[1].table = dscf1_table; | |
168 dscf_vlc[1].table_allocated = 598; | |
140 init_vlc(&dscf_vlc[1], MPC8_DSCF1_BITS, MPC8_DSCF1_SIZE, | 169 init_vlc(&dscf_vlc[1], MPC8_DSCF1_BITS, MPC8_DSCF1_SIZE, |
141 mpc8_dscf1_bits, 1, 1, | 170 mpc8_dscf1_bits, 1, 1, |
142 mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_STATIC); | 171 mpc8_dscf1_codes, 1, 1, INIT_VLC_USE_NEW_STATIC); |
143 | 172 |
173 q3_vlc[0].table = q3_0_table; | |
174 q3_vlc[0].table_allocated = 512; | |
144 init_vlc_sparse(&q3_vlc[0], MPC8_Q3_BITS, MPC8_Q3_SIZE, | 175 init_vlc_sparse(&q3_vlc[0], MPC8_Q3_BITS, MPC8_Q3_SIZE, |
145 mpc8_q3_bits, 1, 1, | 176 mpc8_q3_bits, 1, 1, |
146 mpc8_q3_codes, 1, 1, | 177 mpc8_q3_codes, 1, 1, |
147 mpc8_q3_syms, 1, 1, INIT_VLC_USE_STATIC); | 178 mpc8_q3_syms, 1, 1, INIT_VLC_USE_NEW_STATIC); |
179 q3_vlc[1].table = q3_1_table; | |
180 q3_vlc[1].table_allocated = 516; | |
148 init_vlc_sparse(&q3_vlc[1], MPC8_Q4_BITS, MPC8_Q4_SIZE, | 181 init_vlc_sparse(&q3_vlc[1], MPC8_Q4_BITS, MPC8_Q4_SIZE, |
149 mpc8_q4_bits, 1, 1, | 182 mpc8_q4_bits, 1, 1, |
150 mpc8_q4_codes, 1, 1, | 183 mpc8_q4_codes, 1, 1, |
151 mpc8_q4_syms, 1, 1, INIT_VLC_USE_STATIC); | 184 mpc8_q4_syms, 1, 1, INIT_VLC_USE_NEW_STATIC); |
152 | 185 |
153 for(i = 0; i < 2; i++){ | 186 for(i = 0; i < 2; i++){ |
187 res_vlc[i].table = &codes_table[vlc_offsets[0+i]]; | |
188 res_vlc[i].table_allocated = vlc_offsets[1+i] - vlc_offsets[0+i]; | |
154 init_vlc(&res_vlc[i], MPC8_RES_BITS, MPC8_RES_SIZE, | 189 init_vlc(&res_vlc[i], MPC8_RES_BITS, MPC8_RES_SIZE, |
155 &mpc8_res_bits[i], 1, 1, | 190 &mpc8_res_bits[i], 1, 1, |
156 &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_STATIC); | 191 &mpc8_res_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
157 | 192 |
193 q2_vlc[i].table = &codes_table[vlc_offsets[2+i]]; | |
194 q2_vlc[i].table_allocated = vlc_offsets[3+i] - vlc_offsets[2+i]; | |
158 init_vlc(&q2_vlc[i], MPC8_Q2_BITS, MPC8_Q2_SIZE, | 195 init_vlc(&q2_vlc[i], MPC8_Q2_BITS, MPC8_Q2_SIZE, |
159 &mpc8_q2_bits[i], 1, 1, | 196 &mpc8_q2_bits[i], 1, 1, |
160 &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_STATIC); | 197 &mpc8_q2_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
161 | 198 |
199 quant_vlc[0][i].table = &codes_table[vlc_offsets[4+i]]; | |
200 quant_vlc[0][i].table_allocated = vlc_offsets[5+i] - vlc_offsets[4+i]; | |
162 init_vlc(&quant_vlc[0][i], MPC8_Q5_BITS, MPC8_Q5_SIZE, | 201 init_vlc(&quant_vlc[0][i], MPC8_Q5_BITS, MPC8_Q5_SIZE, |
163 &mpc8_q5_bits[i], 1, 1, | 202 &mpc8_q5_bits[i], 1, 1, |
164 &mpc8_q5_codes[i], 1, 1, INIT_VLC_USE_STATIC); | 203 &mpc8_q5_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
204 quant_vlc[1][i].table = &codes_table[vlc_offsets[6+i]]; | |
205 quant_vlc[1][i].table_allocated = vlc_offsets[7+i] - vlc_offsets[6+i]; | |
165 init_vlc(&quant_vlc[1][i], MPC8_Q6_BITS, MPC8_Q6_SIZE, | 206 init_vlc(&quant_vlc[1][i], MPC8_Q6_BITS, MPC8_Q6_SIZE, |
166 &mpc8_q6_bits[i], 1, 1, | 207 &mpc8_q6_bits[i], 1, 1, |
167 &mpc8_q6_codes[i], 1, 1, INIT_VLC_USE_STATIC); | 208 &mpc8_q6_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
209 quant_vlc[2][i].table = &codes_table[vlc_offsets[8+i]]; | |
210 quant_vlc[2][i].table_allocated = vlc_offsets[9+i] - vlc_offsets[8+i]; | |
168 init_vlc(&quant_vlc[2][i], MPC8_Q7_BITS, MPC8_Q7_SIZE, | 211 init_vlc(&quant_vlc[2][i], MPC8_Q7_BITS, MPC8_Q7_SIZE, |
169 &mpc8_q7_bits[i], 1, 1, | 212 &mpc8_q7_bits[i], 1, 1, |
170 &mpc8_q7_codes[i], 1, 1, INIT_VLC_USE_STATIC); | 213 &mpc8_q7_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
214 quant_vlc[3][i].table = &codes_table[vlc_offsets[10+i]]; | |
215 quant_vlc[3][i].table_allocated = vlc_offsets[11+i] - vlc_offsets[10+i]; | |
171 init_vlc(&quant_vlc[3][i], MPC8_Q8_BITS, MPC8_Q8_SIZE, | 216 init_vlc(&quant_vlc[3][i], MPC8_Q8_BITS, MPC8_Q8_SIZE, |
172 &mpc8_q8_bits[i], 1, 1, | 217 &mpc8_q8_bits[i], 1, 1, |
173 &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_STATIC); | 218 &mpc8_q8_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); |
174 } | 219 } |
175 vlc_initialized = 1; | 220 vlc_initialized = 1; |
176 avctx->sample_fmt = SAMPLE_FMT_S16; | 221 avctx->sample_fmt = SAMPLE_FMT_S16; |
177 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; | 222 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; |
178 return 0; | 223 return 0; |