Mercurial > libavcodec.hg
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++) |
