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;