Mercurial > libavcodec.hg
comparison vorbis.c @ 3802:094fe185d054 libavcodec
make some more functions global so they can be shared with vorbis_enc.c
author | ods15 |
---|---|
date | Sun, 01 Oct 2006 11:59:33 +0000 |
parents | 203cd258fc20 |
children | 5ad55a4e42c2 |
comparison
equal
deleted
inserted
replaced
3801:203cd258fc20 | 3802:094fe185d054 |
---|---|
158 uint_fast32_t exp_bias; | 158 uint_fast32_t exp_bias; |
159 } vorbis_context; | 159 } vorbis_context; |
160 | 160 |
161 /* Helper functions */ | 161 /* Helper functions */ |
162 | 162 |
163 #define ilog(i) av_log2(2*(i)) | |
164 | |
165 #define BARK(x) \ | 163 #define BARK(x) \ |
166 (13.1f*atan(0.00074f*(x))+2.24f*atan(1.85e-8f*(x)*(x))+1e-4f*(x)) | 164 (13.1f*atan(0.00074f*(x))+2.24f*atan(1.85e-8f*(x)*(x))+1e-4f*(x)) |
167 | 165 |
168 static unsigned int nth_root(unsigned int x, unsigned int n) { // x^(1/n) | 166 unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n) { // x^(1/n) |
169 unsigned int ret=0, i, j; | 167 unsigned int ret=0, i, j; |
170 | 168 |
171 do { | 169 do { |
172 ++ret; | 170 ++ret; |
173 for(i=0,j=ret;i<n-1;i++) j*=ret; | 171 for(i=0,j=ret;i<n-1;i++) j*=ret; |
184 } | 182 } |
185 | 183 |
186 | 184 |
187 // Generate vlc codes from vorbis huffman code lengths | 185 // Generate vlc codes from vorbis huffman code lengths |
188 | 186 |
189 static int vorbis_len2vlc(vorbis_context *vc, uint_fast8_t *bits, uint_fast32_t *codes, uint_fast32_t num) { | 187 int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num) { |
190 uint_fast32_t exit_at_level[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | 188 uint_fast32_t exit_at_level[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
191 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; | 189 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
192 | 190 |
193 uint_fast8_t i,j; | 191 uint_fast8_t i,j; |
194 uint_fast32_t code,p; | 192 uint_fast32_t code,p; |
207 for(i=0;i<bits[p];++i) { | 205 for(i=0;i<bits[p];++i) { |
208 exit_at_level[i+1]=1<<i; | 206 exit_at_level[i+1]=1<<i; |
209 } | 207 } |
210 | 208 |
211 #ifdef V_DEBUG | 209 #ifdef V_DEBUG |
212 av_log(vc->avccontext, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]); | 210 av_log(NULL, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]); |
213 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); | 211 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); |
214 for(i=0;i<bits[p];++i) { | 212 for(i=0;i<bits[p];++i) { |
215 av_log(vc->avccontext, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); | 213 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); |
216 } | 214 } |
217 av_log(vc->avccontext, AV_LOG_INFO, "\n"); | 215 av_log(NULL, AV_LOG_INFO, "\n"); |
218 #endif | 216 #endif |
219 | 217 |
220 ++p; | 218 ++p; |
221 | 219 |
222 for(;p<num;++p) { | 220 for(;p<num;++p) { |
233 exit_at_level[j]=code+(1<<(j-1)); | 231 exit_at_level[j]=code+(1<<(j-1)); |
234 } | 232 } |
235 codes[p]=code; | 233 codes[p]=code; |
236 | 234 |
237 #ifdef V_DEBUG | 235 #ifdef V_DEBUG |
238 av_log(vc->avccontext, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]); | 236 av_log(NULL, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]); |
239 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); | 237 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); |
240 for(i=0;i<bits[p];++i) { | 238 for(i=0;i<bits[p];++i) { |
241 av_log(vc->avccontext, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); | 239 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); |
242 } | 240 } |
243 av_log(vc->avccontext, AV_LOG_INFO, "\n"); | 241 av_log(NULL, AV_LOG_INFO, "\n"); |
244 #endif | 242 #endif |
245 | 243 |
246 } | 244 } |
247 | 245 |
248 //FIXME no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC) | 246 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC) |
247 for (p=1; p<33; p++) | |
248 if (exit_at_level[p]) return 1; | |
249 | 249 |
250 return 0; | 250 return 0; |
251 } | 251 } |
252 | 252 |
253 void ff_vorbis_ready_floor1_list(floor1_entry_t * list, int values) { | 253 void ff_vorbis_ready_floor1_list(floor1_entry_t * list, int values) { |
334 | 334 |
335 // Process codebooks part | 335 // Process codebooks part |
336 | 336 |
337 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) { | 337 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) { |
338 uint_fast16_t cb; | 338 uint_fast16_t cb; |
339 uint_fast8_t *tmp_vlc_bits; | 339 uint8_t *tmp_vlc_bits; |
340 uint_fast32_t *tmp_vlc_codes; | 340 uint32_t *tmp_vlc_codes; |
341 GetBitContext *gb=&vc->gb; | 341 GetBitContext *gb=&vc->gb; |
342 | 342 |
343 vc->codebook_count=get_bits(gb,8)+1; | 343 vc->codebook_count=get_bits(gb,8)+1; |
344 | 344 |
345 AV_DEBUG(" Codebooks: %d \n", vc->codebook_count); | 345 AV_DEBUG(" Codebooks: %d \n", vc->codebook_count); |
346 | 346 |
347 vc->codebooks=(vorbis_codebook *)av_mallocz(vc->codebook_count * sizeof(vorbis_codebook)); | 347 vc->codebooks=(vorbis_codebook *)av_mallocz(vc->codebook_count * sizeof(vorbis_codebook)); |
348 tmp_vlc_bits=(uint_fast8_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast8_t)); | 348 tmp_vlc_bits=(uint8_t *)av_mallocz(V_MAX_VLCS * sizeof(uint8_t)); |
349 tmp_vlc_codes=(uint_fast32_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast32_t)); | 349 tmp_vlc_codes=(uint32_t *)av_mallocz(V_MAX_VLCS * sizeof(uint32_t)); |
350 | 350 |
351 for(cb=0;cb<vc->codebook_count;++cb) { | 351 for(cb=0;cb<vc->codebook_count;++cb) { |
352 vorbis_codebook *codebook_setup=&vc->codebooks[cb]; | 352 vorbis_codebook *codebook_setup=&vc->codebooks[cb]; |
353 uint_fast8_t ordered; | 353 uint_fast8_t ordered; |
354 uint_fast32_t t, used_entries=0; | 354 uint_fast32_t t, used_entries=0; |
437 | 437 |
438 // If the codebook is used for (inverse) VQ, calculate codevectors. | 438 // If the codebook is used for (inverse) VQ, calculate codevectors. |
439 | 439 |
440 if (codebook_setup->lookup_type==1) { | 440 if (codebook_setup->lookup_type==1) { |
441 uint_fast16_t i, j, k; | 441 uint_fast16_t i, j, k; |
442 uint_fast16_t codebook_lookup_values=nth_root(entries, codebook_setup->dimensions); | 442 uint_fast16_t codebook_lookup_values=ff_vorbis_nth_root(entries, codebook_setup->dimensions); |
443 uint_fast16_t codebook_multiplicands[codebook_lookup_values]; | 443 uint_fast16_t codebook_multiplicands[codebook_lookup_values]; |
444 | 444 |
445 float codebook_minimum_value=vorbisfloat2float(get_bits_long(gb, 32)); | 445 float codebook_minimum_value=vorbisfloat2float(get_bits_long(gb, 32)); |
446 float codebook_delta_value=vorbisfloat2float(get_bits_long(gb, 32)); | 446 float codebook_delta_value=vorbisfloat2float(get_bits_long(gb, 32)); |
447 uint_fast8_t codebook_value_bits=get_bits(gb, 4)+1; | 447 uint_fast8_t codebook_value_bits=get_bits(gb, 4)+1; |
501 av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n"); | 501 av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n"); |
502 goto error; | 502 goto error; |
503 } | 503 } |
504 | 504 |
505 // Initialize VLC table | 505 // Initialize VLC table |
506 if (vorbis_len2vlc(vc, tmp_vlc_bits, tmp_vlc_codes, entries)) { | 506 if (ff_vorbis_len2vlc(tmp_vlc_bits, tmp_vlc_codes, entries)) { |
507 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n"); | 507 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n"); |
508 goto error; | 508 goto error; |
509 } | 509 } |
510 codebook_setup->maxdepth=0; | 510 codebook_setup->maxdepth=0; |
511 for(t=0;t<entries;++t) | 511 for(t=0;t<entries;++t) |
1361 | 1361 |
1362 for(i=1;i<vf->x_list_dim;++i) { | 1362 for(i=1;i<vf->x_list_dim;++i) { |
1363 AV_DEBUG(" Looking at post %d \n", i); | 1363 AV_DEBUG(" Looking at post %d \n", i); |
1364 | 1364 |
1365 if (floor1_flag[vf->list[i].sort]) { // SPEC mispelled | 1365 if (floor1_flag[vf->list[i].sort]) { // SPEC mispelled |
1366 int_fast16_t x, y, dy, base, sy; // if uncommented: dy = -32 adx = 2 base = 2blablabla ????? | |
1367 | |
1368 hy=floor1_Y_final[vf->list[i].sort]*vf->multiplier; | 1366 hy=floor1_Y_final[vf->list[i].sort]*vf->multiplier; |
1369 hx=vf->list[vf->list[i].sort].x; | 1367 hx=vf->list[vf->list[i].sort].x; |
1370 | 1368 |
1371 dy=hy-ly; | 1369 render_line(lx, ly, hx, hy, vec, vc->blocksize[1]); |
1372 adx=hx-lx; | |
1373 ady= (dy<0) ? -dy:dy;//ABS(dy); | |
1374 base=(int16_t)dy/(int16_t)adx; | |
1375 | |
1376 AV_DEBUG(" dy %d adx %d base %d = %d \n", dy, adx, base, dy/adx); | |
1377 | |
1378 x=lx; | |
1379 y=ly; | |
1380 err=0; | |
1381 if (dy<0) { | |
1382 sy=base-1; | |
1383 } else { | |
1384 sy=base+1; | |
1385 } | |
1386 ady=ady-(base<0 ? -base : base)*adx; | |
1387 vec[x]=ff_vorbis_floor1_inverse_db_table[y]; | |
1388 | |
1389 AV_DEBUG(" vec[ %d ] = %d \n", x, y); | |
1390 | |
1391 for(x=lx+1;(x<hx) && (x<vf->list[1].x);++x) { | |
1392 err+=ady; | |
1393 if (err>=adx) { | |
1394 err-=adx; | |
1395 y+=sy; | |
1396 } else { | |
1397 y+=base; | |
1398 } | |
1399 vec[x]=ff_vorbis_floor1_inverse_db_table[y]; | |
1400 | |
1401 AV_DEBUG(" vec[ %d ] = %d \n", x, y); | |
1402 } | |
1403 | |
1404 /* for(j=1;j<hx-lx+1;++j) { // iterating render_point | |
1405 dy=hy-ly; | |
1406 adx=hx-lx; | |
1407 ady= dy<0 ? -dy : dy; | |
1408 err=ady*j; | |
1409 off=err/adx; | |
1410 if (dy<0) { | |
1411 predicted=ly-off; | |
1412 } else { | |
1413 predicted=ly+off; | |
1414 } | |
1415 if (lx+j < vf->x_list[1]) { | |
1416 vec[lx+j]=ff_vorbis_floor1_inverse_db_table[predicted]; | |
1417 } | |
1418 }*/ | |
1419 | 1370 |
1420 lx=hx; | 1371 lx=hx; |
1421 ly=hy; | 1372 ly=hy; |
1422 } | 1373 } |
1423 } | 1374 } |
1424 | 1375 |
1425 if (hx<vf->list[1].x) { | 1376 if (hx<vf->list[1].x) { |
1426 for(i=hx;i<vf->list[1].x;++i) { | 1377 render_line(hx, hy, vf->list[1].x, hy, vec, vc->blocksize[1]); |
1427 vec[i]=ff_vorbis_floor1_inverse_db_table[hy]; | |
1428 } | |
1429 } | 1378 } |
1430 | 1379 |
1431 AV_DEBUG(" Floor decoded\n"); | 1380 AV_DEBUG(" Floor decoded\n"); |
1432 | 1381 |
1433 return 0; | 1382 return 0; |