Mercurial > libavcodec.hg
comparison vorbis.c @ 3536:545a15c19c91 libavcodec
sse & sse2 implementations of vorbis channel coupling.
9% faster vorbis (on a K8).
| author | lorenm |
|---|---|
| date | Thu, 03 Aug 2006 03:18:47 +0000 |
| parents | a14c98a0ca3d |
| children | f31fda209742 |
comparison
equal
deleted
inserted
replaced
| 3535:a14c98a0ca3d | 3536:545a15c19c91 |
|---|---|
| 927 int header_len[3]; | 927 int header_len[3]; |
| 928 GetBitContext *gb = &(vc->gb); | 928 GetBitContext *gb = &(vc->gb); |
| 929 int i, j, hdr_type; | 929 int i, j, hdr_type; |
| 930 | 930 |
| 931 vc->avccontext = avccontext; | 931 vc->avccontext = avccontext; |
| 932 dsputil_init(&vc->dsp, avccontext); | |
| 932 | 933 |
| 933 if (!headers_len) { | 934 if (!headers_len) { |
| 934 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); | 935 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); |
| 935 return -1; | 936 return -1; |
| 936 } | 937 } |
| 1441 } | 1442 } |
| 1442 } | 1443 } |
| 1443 return 0; | 1444 return 0; |
| 1444 } | 1445 } |
| 1445 | 1446 |
| 1447 void vorbis_inverse_coupling(float *mag, float *ang, int blocksize) | |
| 1448 { | |
| 1449 int i; | |
| 1450 for(i=0; i<blocksize; i++) | |
| 1451 { | |
| 1452 if (mag[i]>0.0) { | |
| 1453 if (ang[i]>0.0) { | |
| 1454 ang[i]=mag[i]-ang[i]; | |
| 1455 } else { | |
| 1456 float temp=ang[i]; | |
| 1457 ang[i]=mag[i]; | |
| 1458 mag[i]+=temp; | |
| 1459 } | |
| 1460 } else { | |
| 1461 if (ang[i]>0.0) { | |
| 1462 ang[i]+=mag[i]; | |
| 1463 } else { | |
| 1464 float temp=ang[i]; | |
| 1465 ang[i]=mag[i]; | |
| 1466 mag[i]-=temp; | |
| 1467 } | |
| 1468 } | |
| 1469 } | |
| 1470 } | |
| 1471 | |
| 1446 // Decode the audio packet using the functions above | 1472 // Decode the audio packet using the functions above |
| 1447 #define BIAS 385 | 1473 #define BIAS 385 |
| 1448 | 1474 |
| 1449 static int vorbis_parse_audio_packet(vorbis_context *vc) { | 1475 static int vorbis_parse_audio_packet(vorbis_context *vc) { |
| 1450 GetBitContext *gb=&vc->gb; | 1476 GetBitContext *gb=&vc->gb; |
| 1539 for(i=mapping->coupling_steps-1;i>=0;--i) { //warning: i has to be signed | 1565 for(i=mapping->coupling_steps-1;i>=0;--i) { //warning: i has to be signed |
| 1540 float *mag, *ang; | 1566 float *mag, *ang; |
| 1541 | 1567 |
| 1542 mag=vc->channel_residues+res_chan[mapping->magnitude[i]]*blocksize/2; | 1568 mag=vc->channel_residues+res_chan[mapping->magnitude[i]]*blocksize/2; |
| 1543 ang=vc->channel_residues+res_chan[mapping->angle[i]]*blocksize/2; | 1569 ang=vc->channel_residues+res_chan[mapping->angle[i]]*blocksize/2; |
| 1544 for(j=0;j<blocksize/2;++j) { | 1570 vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize/2); |
| 1545 float temp; | |
| 1546 if (mag[j]>0.0) { | |
| 1547 if (ang[j]>0.0) { | |
| 1548 ang[j]=mag[j]-ang[j]; | |
| 1549 } else { | |
| 1550 temp=ang[j]; | |
| 1551 ang[j]=mag[j]; | |
| 1552 mag[j]+=temp; | |
| 1553 } | |
| 1554 } else { | |
| 1555 if (ang[j]>0.0) { | |
| 1556 ang[j]+=mag[j]; | |
| 1557 } else { | |
| 1558 temp=ang[j]; | |
| 1559 ang[j]=mag[j]; | |
| 1560 mag[j]-=temp; | |
| 1561 } | |
| 1562 } | |
| 1563 } | |
| 1564 } | 1571 } |
| 1565 | 1572 |
| 1566 // Dotproduct | 1573 // Dotproduct |
| 1567 | 1574 |
| 1568 for(j=0, ch_floor_ptr=vc->channel_floors;j<vc->audio_channels;++j,ch_floor_ptr+=blocksize/2) { | 1575 for(j=0, ch_floor_ptr=vc->channel_floors;j<vc->audio_channels;++j,ch_floor_ptr+=blocksize/2) { |
