From 9072c29e40284d2ddf9d1f2cc0921e20a91f89c6 Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Mon, 21 Sep 2009 04:15:12 +0000 Subject: [PATCH] aacenc: Split paths in the scalefactor selection trellis into a 2-D array. Originally committed as revision 19947 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/aaccoder.c | 95 ++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c index b4c1e8e656..a6e69f0ac6 100644 --- a/libavcodec/aaccoder.c +++ b/libavcodec/aaccoder.c @@ -468,26 +468,28 @@ static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, const float lambda) { int q, w, w2, g, start = 0; - int i; + int i, j; int idx; - TrellisPath paths[256*121]; + TrellisPath paths[121][256]; int bandaddr[121]; int minq; float mincost; for (i = 0; i < 256; i++) { - paths[i].cost = 0.0f; - paths[i].prev = -1; - paths[i].min_val = i; - paths[i].max_val = i; + paths[0][i].cost = 0.0f; + paths[0][i].prev = -1; + paths[0][i].min_val = i; + paths[0][i].max_val = i; } - for (i = 256; i < 256*121; i++) { - paths[i].cost = INFINITY; - paths[i].prev = -2; - paths[i].min_val = INT_MAX; - paths[i].max_val = 0; + for (j = 1; j < 121; j++) { + for (i = 0; i < 256; i++) { + paths[j][i].cost = INFINITY; + paths[j][i].prev = -2; + paths[j][i].min_val = INT_MAX; + paths[j][i].max_val = 0; + } } - idx = 256; + idx = 1; abs_pow34_v(s->scoefs, sce->coeffs, 1024); for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { start = w*128; @@ -496,7 +498,7 @@ static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, float qmin, qmax; int nz = 0; - bandaddr[idx >> 8] = w * 16 + g; + bandaddr[idx] = w * 16 + g; qmin = INT_MAX; qmax = 0.0f; for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { @@ -539,63 +541,64 @@ static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { float cost; int minv, maxv; - if (isinf(paths[idx - 256 + i].cost)) + if (isinf(paths[idx - 1][i].cost)) continue; - cost = paths[idx - 256 + i].cost + dist + cost = paths[idx - 1][i].cost + dist + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; - minv = FFMIN(paths[idx - 256 + i].min_val, q); - maxv = FFMAX(paths[idx - 256 + i].max_val, q); - if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { - paths[idx + q].cost = cost; - paths[idx + q].prev = idx - 256 + i; - paths[idx + q].min_val = minv; - paths[idx + q].max_val = maxv; + minv = FFMIN(paths[idx - 1][i].min_val, q); + maxv = FFMAX(paths[idx - 1][i].max_val, q); + if (cost < paths[idx][q].cost && maxv-minv < SCALE_MAX_DIFF) { + paths[idx][q].cost = cost; + paths[idx][q].prev = i; + paths[idx][q].min_val = minv; + paths[idx][q].max_val = maxv; } } } } else { for (q = 0; q < 256; q++) { - if (!isinf(paths[idx - 256 + q].cost)) { - paths[idx + q].cost = paths[idx - 256 + q].cost + 1; - paths[idx + q].prev = idx - 256 + q; - paths[idx + q].min_val = FFMIN(paths[idx - 256 + q].min_val, q); - paths[idx + q].max_val = FFMAX(paths[idx - 256 + q].max_val, q); + if (!isinf(paths[idx - 1][q].cost)) { + paths[idx][q].cost = paths[idx - 1][q].cost + 1; + paths[idx][q].prev = q; + paths[idx][q].min_val = FFMIN(paths[idx - 1][q].min_val, q); + paths[idx][q].max_val = FFMAX(paths[idx - 1][q].max_val, q); continue; } for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { float cost; int minv, maxv; - if (isinf(paths[idx - 256 + i].cost)) + if (isinf(paths[idx - 1][i].cost)) continue; - cost = paths[idx - 256 + i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; - minv = FFMIN(paths[idx - 256 + i].min_val, q); - maxv = FFMAX(paths[idx - 256 + i].max_val, q); - if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { - paths[idx + q].cost = cost; - paths[idx + q].prev = idx - 256 + i; - paths[idx + q].min_val = minv; - paths[idx + q].max_val = maxv; + cost = paths[idx - 1][i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; + minv = FFMIN(paths[idx - 1][i].min_val, q); + maxv = FFMAX(paths[idx - 1][i].max_val, q); + if (cost < paths[idx][q].cost && maxv-minv < SCALE_MAX_DIFF) { + paths[idx][q].cost = cost; + paths[idx][q].prev = i; + paths[idx][q].min_val = minv; + paths[idx][q].max_val = maxv; } } } } sce->zeroes[w*16+g] = !nz; start += sce->ics.swb_sizes[g]; - idx += 256; + idx++; } } - idx -= 256; - mincost = paths[idx].cost; - minq = idx; + idx--; + mincost = paths[idx][0].cost; + minq = 0; for (i = 1; i < 256; i++) { - if (paths[idx + i].cost < mincost) { - mincost = paths[idx + i].cost; - minq = idx + i; + if (paths[idx][i].cost < mincost) { + mincost = paths[idx][i].cost; + minq = i; } } - while (minq >= 256) { - sce->sf_idx[bandaddr[minq>>8]] = minq & 0xFF; - minq = paths[minq].prev; + while (idx) { + sce->sf_idx[bandaddr[idx]] = minq; + minq = paths[idx][minq].prev; + idx--; } //set the same quantizers inside window groups for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])