mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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
This commit is contained in:
parent
9d4f6f10ae
commit
9072c29e40
@ -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])
|
||||
|
Loading…
Reference in New Issue
Block a user