Mercurial > libavcodec.hg
comparison aaccoder.c @ 11762:91b9bd17e79c libavcodec
aacenc: Trellis over scalefactors using an estimated codebook rather than every codebook.
The minimal codebook to encode the band without clipping is used (as is done in the TLS).
author | alexc |
---|---|
date | Tue, 25 May 2010 18:31:55 +0000 |
parents | 418455c7e31f |
children | 3fee94a43e64 |
comparison
equal
deleted
inserted
replaced
11761:418455c7e31f | 11762:91b9bd17e79c |
---|---|
566 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero | 566 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero |
567 maxscale = av_clip_uint8(log2(qmax)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512); | 567 maxscale = av_clip_uint8(log2(qmax)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512); |
568 minscale = av_clip(minscale - q0, 0, TRELLIS_STATES - 1); | 568 minscale = av_clip(minscale - q0, 0, TRELLIS_STATES - 1); |
569 maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES); | 569 maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES); |
570 for (q = minscale; q < maxscale; q++) { | 570 for (q = minscale; q < maxscale; q++) { |
571 float dists[12], dist; | 571 float dist = 0; |
572 memset(dists, 0, sizeof(dists)); | 572 int cb = find_min_book(sce->sf_idx[w*16+g], sce->ics.group_len[w], sce->ics.swb_sizes[g], s->scoefs+start); |
573 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { | 573 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
574 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; | 574 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
575 int cb; | 575 dist += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g], |
576 for (cb = 0; cb <= ESC_BT; cb++) | |
577 dists[cb] += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g], | |
578 q + q0, cb, lambda / band->threshold, INFINITY, NULL); | 576 q + q0, cb, lambda / band->threshold, INFINITY, NULL); |
579 } | 577 } |
580 dist = dists[0]; | |
581 for (i = 1; i <= ESC_BT; i++) | |
582 dist = FFMIN(dist, dists[i]); | |
583 minrd = FFMIN(minrd, dist); | 578 minrd = FFMIN(minrd, dist); |
584 | 579 |
585 for (i = 0; i < q1 - q0; i++) { | 580 for (i = 0; i < q1 - q0; i++) { |
586 float cost; | 581 float cost; |
587 if (isinf(paths[idx - 1][i].cost)) | 582 if (isinf(paths[idx - 1][i].cost)) |