comparison aaccoder.c @ 10212:4e2db0d76fad libavcodec

aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
author alexc
date Mon, 21 Sep 2009 04:15:12 +0000
parents 337e5592f985
children cebf6e3381e0
comparison
equal deleted inserted replaced
10211:337e5592f985 10212:4e2db0d76fad
466 static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, 466 static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s,
467 SingleChannelElement *sce, 467 SingleChannelElement *sce,
468 const float lambda) 468 const float lambda)
469 { 469 {
470 int q, w, w2, g, start = 0; 470 int q, w, w2, g, start = 0;
471 int i; 471 int i, j;
472 int idx; 472 int idx;
473 TrellisPath paths[256*121]; 473 TrellisPath paths[121][256];
474 int bandaddr[121]; 474 int bandaddr[121];
475 int minq; 475 int minq;
476 float mincost; 476 float mincost;
477 477
478 for (i = 0; i < 256; i++) { 478 for (i = 0; i < 256; i++) {
479 paths[i].cost = 0.0f; 479 paths[0][i].cost = 0.0f;
480 paths[i].prev = -1; 480 paths[0][i].prev = -1;
481 paths[i].min_val = i; 481 paths[0][i].min_val = i;
482 paths[i].max_val = i; 482 paths[0][i].max_val = i;
483 } 483 }
484 for (i = 256; i < 256*121; i++) { 484 for (j = 1; j < 121; j++) {
485 paths[i].cost = INFINITY; 485 for (i = 0; i < 256; i++) {
486 paths[i].prev = -2; 486 paths[j][i].cost = INFINITY;
487 paths[i].min_val = INT_MAX; 487 paths[j][i].prev = -2;
488 paths[i].max_val = 0; 488 paths[j][i].min_val = INT_MAX;
489 } 489 paths[j][i].max_val = 0;
490 idx = 256; 490 }
491 }
492 idx = 1;
491 abs_pow34_v(s->scoefs, sce->coeffs, 1024); 493 abs_pow34_v(s->scoefs, sce->coeffs, 1024);
492 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 494 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
493 start = w*128; 495 start = w*128;
494 for (g = 0; g < sce->ics.num_swb; g++) { 496 for (g = 0; g < sce->ics.num_swb; g++) {
495 const float *coefs = sce->coeffs + start; 497 const float *coefs = sce->coeffs + start;
496 float qmin, qmax; 498 float qmin, qmax;
497 int nz = 0; 499 int nz = 0;
498 500
499 bandaddr[idx >> 8] = w * 16 + g; 501 bandaddr[idx] = w * 16 + g;
500 qmin = INT_MAX; 502 qmin = INT_MAX;
501 qmax = 0.0f; 503 qmax = 0.0f;
502 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 504 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
503 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; 505 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g];
504 if (band->energy <= band->threshold || band->threshold == 0.0f) { 506 if (band->energy <= band->threshold || band->threshold == 0.0f) {
537 minrd = FFMIN(minrd, dist); 539 minrd = FFMIN(minrd, dist);
538 540
539 for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { 541 for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) {
540 float cost; 542 float cost;
541 int minv, maxv; 543 int minv, maxv;
542 if (isinf(paths[idx - 256 + i].cost)) 544 if (isinf(paths[idx - 1][i].cost))
543 continue; 545 continue;
544 cost = paths[idx - 256 + i].cost + dist 546 cost = paths[idx - 1][i].cost + dist
545 + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; 547 + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO];
546 minv = FFMIN(paths[idx - 256 + i].min_val, q); 548 minv = FFMIN(paths[idx - 1][i].min_val, q);
547 maxv = FFMAX(paths[idx - 256 + i].max_val, q); 549 maxv = FFMAX(paths[idx - 1][i].max_val, q);
548 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { 550 if (cost < paths[idx][q].cost && maxv-minv < SCALE_MAX_DIFF) {
549 paths[idx + q].cost = cost; 551 paths[idx][q].cost = cost;
550 paths[idx + q].prev = idx - 256 + i; 552 paths[idx][q].prev = i;
551 paths[idx + q].min_val = minv; 553 paths[idx][q].min_val = minv;
552 paths[idx + q].max_val = maxv; 554 paths[idx][q].max_val = maxv;
553 } 555 }
554 } 556 }
555 } 557 }
556 } else { 558 } else {
557 for (q = 0; q < 256; q++) { 559 for (q = 0; q < 256; q++) {
558 if (!isinf(paths[idx - 256 + q].cost)) { 560 if (!isinf(paths[idx - 1][q].cost)) {
559 paths[idx + q].cost = paths[idx - 256 + q].cost + 1; 561 paths[idx][q].cost = paths[idx - 1][q].cost + 1;
560 paths[idx + q].prev = idx - 256 + q; 562 paths[idx][q].prev = q;
561 paths[idx + q].min_val = FFMIN(paths[idx - 256 + q].min_val, q); 563 paths[idx][q].min_val = FFMIN(paths[idx - 1][q].min_val, q);
562 paths[idx + q].max_val = FFMAX(paths[idx - 256 + q].max_val, q); 564 paths[idx][q].max_val = FFMAX(paths[idx - 1][q].max_val, q);
563 continue; 565 continue;
564 } 566 }
565 for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { 567 for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) {
566 float cost; 568 float cost;
567 int minv, maxv; 569 int minv, maxv;
568 if (isinf(paths[idx - 256 + i].cost)) 570 if (isinf(paths[idx - 1][i].cost))
569 continue; 571 continue;
570 cost = paths[idx - 256 + i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; 572 cost = paths[idx - 1][i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO];
571 minv = FFMIN(paths[idx - 256 + i].min_val, q); 573 minv = FFMIN(paths[idx - 1][i].min_val, q);
572 maxv = FFMAX(paths[idx - 256 + i].max_val, q); 574 maxv = FFMAX(paths[idx - 1][i].max_val, q);
573 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { 575 if (cost < paths[idx][q].cost && maxv-minv < SCALE_MAX_DIFF) {
574 paths[idx + q].cost = cost; 576 paths[idx][q].cost = cost;
575 paths[idx + q].prev = idx - 256 + i; 577 paths[idx][q].prev = i;
576 paths[idx + q].min_val = minv; 578 paths[idx][q].min_val = minv;
577 paths[idx + q].max_val = maxv; 579 paths[idx][q].max_val = maxv;
578 } 580 }
579 } 581 }
580 } 582 }
581 } 583 }
582 sce->zeroes[w*16+g] = !nz; 584 sce->zeroes[w*16+g] = !nz;
583 start += sce->ics.swb_sizes[g]; 585 start += sce->ics.swb_sizes[g];
584 idx += 256; 586 idx++;
585 } 587 }
586 } 588 }
587 idx -= 256; 589 idx--;
588 mincost = paths[idx].cost; 590 mincost = paths[idx][0].cost;
589 minq = idx; 591 minq = 0;
590 for (i = 1; i < 256; i++) { 592 for (i = 1; i < 256; i++) {
591 if (paths[idx + i].cost < mincost) { 593 if (paths[idx][i].cost < mincost) {
592 mincost = paths[idx + i].cost; 594 mincost = paths[idx][i].cost;
593 minq = idx + i; 595 minq = i;
594 } 596 }
595 } 597 }
596 while (minq >= 256) { 598 while (idx) {
597 sce->sf_idx[bandaddr[minq>>8]] = minq & 0xFF; 599 sce->sf_idx[bandaddr[idx]] = minq;
598 minq = paths[minq].prev; 600 minq = paths[idx][minq].prev;
601 idx--;
599 } 602 }
600 //set the same quantizers inside window groups 603 //set the same quantizers inside window groups
601 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) 604 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
602 for (g = 0; g < sce->ics.num_swb; g++) 605 for (g = 0; g < sce->ics.num_swb; g++)
603 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++) 606 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)