Mercurial > libavcodec.hg
comparison aaccoder.c @ 11686:41a083a2527a libavcodec
Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
| author | alexc |
|---|---|
| date | Thu, 06 May 2010 20:18:36 +0000 |
| parents | 7dd2a45249a9 |
| children | 6f5bee041560 |
comparison
equal
deleted
inserted
replaced
| 11685:d3098fb8ec05 | 11686:41a083a2527a |
|---|---|
| 761 for (g = 0; g < sce->ics.num_swb; g++) { | 761 for (g = 0; g < sce->ics.num_swb; g++) { |
| 762 const float *coefs = sce->coeffs + start; | 762 const float *coefs = sce->coeffs + start; |
| 763 const float *scaled = s->scoefs + start; | 763 const float *scaled = s->scoefs + start; |
| 764 const int size = sce->ics.swb_sizes[g]; | 764 const int size = sce->ics.swb_sizes[g]; |
| 765 int scf, prev_scf, step; | 765 int scf, prev_scf, step; |
| 766 int min_scf = 0, max_scf = 255; | 766 int min_scf = -1, max_scf = 256; |
| 767 float curdiff; | 767 float curdiff; |
| 768 if (maxq[w*16+g] < 21.544) { | 768 if (maxq[w*16+g] < 21.544) { |
| 769 sce->zeroes[w*16+g] = 1; | 769 sce->zeroes[w*16+g] = 1; |
| 770 start += size; | 770 start += size; |
| 771 continue; | 771 continue; |
| 795 sce->sf_idx[w*16+g] = prev_scf; | 795 sce->sf_idx[w*16+g] = prev_scf; |
| 796 break; | 796 break; |
| 797 } | 797 } |
| 798 prev_scf = scf; | 798 prev_scf = scf; |
| 799 curdiff = fabsf(dist - uplim[w*16+g]); | 799 curdiff = fabsf(dist - uplim[w*16+g]); |
| 800 if (curdiff == 0.0f) | 800 if (curdiff <= 1.0f) |
| 801 step = 0; | 801 step = 0; |
| 802 else | 802 else |
| 803 step = fabsf(log2(curdiff)); | 803 step = log2(curdiff); |
| 804 if (dist > uplim[w*16+g]) | 804 if (dist > uplim[w*16+g]) |
| 805 step = -step; | 805 step = -step; |
| 806 scf += step; | |
| 807 av_clip_uint8(scf); | |
| 808 step = scf - prev_scf; | |
| 806 if (FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) { | 809 if (FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) { |
| 807 sce->sf_idx[w*16+g] = scf; | 810 sce->sf_idx[w*16+g] = av_clip(scf, min_scf, max_scf); |
| 808 break; | 811 break; |
| 809 } | 812 } |
| 810 scf += step; | |
| 811 if (step > 0) | 813 if (step > 0) |
| 812 min_scf = scf; | 814 min_scf = prev_scf; |
| 813 else | 815 else |
| 814 max_scf = scf; | 816 max_scf = prev_scf; |
| 815 } | 817 } |
| 816 start += size; | 818 start += size; |
| 817 } | 819 } |
| 818 } | 820 } |
| 819 minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX; | 821 minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX; |
