Some more AAC stuffs.

from Brad (maintainer)
This commit is contained in:
ajacoutot 2015-09-27 06:35:33 +00:00
parent 5a5e26ea83
commit c9948ce5a9
3 changed files with 49 additions and 47 deletions

View File

@ -1,11 +1,11 @@
# $OpenBSD: Makefile,v 1.127 2015/09/23 09:16:45 ajacoutot Exp $
# $OpenBSD: Makefile,v 1.128 2015/09/27 06:35:33 ajacoutot Exp $
COMMENT= audio/video converter and streamer
V= 20150909
DISTNAME= ffmpeg-git-${V}
PKGNAME= ffmpeg-${V}
REVISION= 3
REVISION= 4
CATEGORIES= graphics multimedia
MASTER_SITES= http://comstyle.com/source/
EXTRACT_SUFX= .tar.xz

View File

@ -1,4 +1,4 @@
$OpenBSD: patch-libavcodec_aaccoder_c,v 1.2 2015/09/23 09:16:45 ajacoutot Exp $
$OpenBSD: patch-libavcodec_aaccoder_c,v 1.3 2015/09/27 06:35:33 ajacoutot Exp $
aaccoder: use roundf() instead of ceilf()
@ -12,8 +12,12 @@ aaccoder: respect cutoff when marking bands as PNS
AAC encoder: refactor to resynchronize MIPS port
AAC encoder: tweak PNS usage to be more aggressive
AAC encoder: fix OOB access in search_for_pns
--- libavcodec/aaccoder.c.orig Mon Sep 7 21:58:01 2015
+++ libavcodec/aaccoder.c Wed Sep 23 03:48:35 2015
+++ libavcodec/aaccoder.c Sat Sep 26 13:22:59 2015
@@ -48,18 +48,21 @@
#include "aacenc_tns.h"
#include "aacenc_pred.h"
@ -354,7 +358,7 @@ AAC encoder: refactor to resynchronize MIPS port
static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s,
SingleChannelElement *sce,
const float lambda)
@@ -863,32 +586,83 @@ static void search_for_quantizers_fast(AVCodecContext
@@ -863,32 +586,78 @@ static void search_for_quantizers_fast(AVCodecContext
static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce)
{
@ -368,13 +372,12 @@ AAC encoder: refactor to resynchronize MIPS port
- const float spread_threshold = NOISE_SPREAD_THRESHOLD*(lambda/120.f);
- const float thr_mult = NOISE_LAMBDA_NUMERATOR/lambda;
+ const float thr_mult = NOISE_LAMBDA_REPLACE*(100.0f/lambda);
+ const float spread_threshold = NOISE_SPREAD_THRESHOLD*(lambda/100.f);
+ const float spread_threshold = NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f);
+ if (sce->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE)
+ return;
+
+ memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type));
for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
- start = 0;
+ int wstart = w*128;
for (g = 0; g < sce->ics.num_swb; g++) {
- if (start*freq_mult > NOISE_LOW_LIMIT*(lambda/170.0f)) {
- float energy = 0.0f, threshold = 0.0f, spread = 0.0f;
@ -383,12 +386,20 @@ AAC encoder: refactor to resynchronize MIPS port
- energy += band->energy;
- threshold += band->threshold;
- spread += band->spread;
- }
- if (spread > spread_threshold*sce->ics.group_len[w] &&
- ((sce->zeroes[w*16+g] && energy >= threshold) ||
- energy < threshold*thr_mult*sce->ics.group_len[w])) {
- sce->band_type[w*16+g] = NOISE_BT;
- sce->pns_ener[w*16+g] = energy / sce->ics.group_len[w];
- sce->zeroes[w*16+g] = 0;
- }
+ int noise_sfi;
+ float dist1 = 0.0f, dist2 = 0.0f, noise_amp;
+ float pns_energy = 0.0f, energy_ratio, dist_thresh;
+ float pns_energy = 0.0f, pns_tgt_energy, energy_ratio, dist_thresh;
+ float sfb_energy = 0.0f, threshold = 0.0f, spread = 0.0f;
+ const int start = sce->ics.swb_offset[w*16+g];
+ const float freq = start*freq_mult;
+ const int start = wstart+sce->ics.swb_offset[g];
+ const float freq = (start-wstart)*freq_mult;
+ const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f);
+ if (freq < NOISE_LOW_LIMIT || avctx->cutoff && freq >= avctx->cutoff)
+ continue;
@ -397,29 +408,35 @@ AAC encoder: refactor to resynchronize MIPS port
+ sfb_energy += band->energy;
+ spread += band->spread;
+ threshold += band->threshold;
+ }
}
- start += sce->ics.swb_sizes[g];
+
+ /* Ramps down at ~8000Hz and loosens the dist threshold */
+ dist_thresh = FFMIN(2.5f*NOISE_LOW_LIMIT/freq, 1.27f);
+ dist_thresh = FFMIN(2.5f*NOISE_LOW_LIMIT/freq, 2.5f);
+
+ if (sce->zeroes[w*16+g] || spread < spread_threshold ||
+ sfb_energy > threshold*thr_mult*freq_boost) {
+ /* zero and energy close to threshold usually means hole avoidance,
+ * we do want to remain avoiding holes with PNS
+ */
+ if (((sce->zeroes[w*16+g] || !sce->band_alt[w*16+g]) && sfb_energy < threshold*sqrtf(1.5f/freq_boost)) || spread < spread_threshold ||
+ (sce->band_alt[w*16+g] && sfb_energy > threshold*thr_mult*freq_boost)) {
+ sce->pns_ener[w*16+g] = sfb_energy;
+ continue;
+ }
+
+ noise_sfi = av_clip(roundf(log2f(sfb_energy)*2), -100, 155); /* Quantize */
+ pns_tgt_energy = sfb_energy*spread*spread/sce->ics.group_len[w];
+ noise_sfi = av_clip(roundf(log2f(pns_tgt_energy)*2), -100, 155); /* Quantize */
+ noise_amp = -ff_aac_pow2sf_tab[noise_sfi + POW_SF2_ZERO]; /* Dequantize */
+ for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
+ float band_energy, scale;
+ const int start_c = sce->ics.swb_offset[(w+w2)*16+g];
+ float band_energy, scale, pns_senergy;
+ const int start_c = (w+w2)*128+sce->ics.swb_offset[g];
+ band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
+ for (i = 0; i < sce->ics.swb_sizes[g]; i++)
+ PNS[i] = s->random_state = lcg_random(s->random_state);
+ band_energy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]);
+ scale = noise_amp/sqrtf(band_energy);
+ s->fdsp->vector_fmul_scalar(PNS, PNS, scale, sce->ics.swb_sizes[g]);
+ pns_energy += s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]);
+ pns_senergy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]);
+ pns_energy += pns_senergy;
+ abs_pow34_v(NOR34, &sce->coeffs[start_c], sce->ics.swb_sizes[g]);
+ abs_pow34_v(PNS34, PNS, sce->ics.swb_sizes[g]);
+ dist1 += quantize_band_cost(s, &sce->coeffs[start_c],
@ -428,32 +445,15 @@ AAC encoder: refactor to resynchronize MIPS port
+ sce->sf_idx[(w+w2)*16+g],
+ sce->band_alt[(w+w2)*16+g],
+ lambda/band->threshold, INFINITY, NULL, 0);
+ dist2 += quantize_band_cost(s, PNS,
+ PNS34,
+ sce->ics.swb_sizes[g],
+ noise_sfi,
+ NOISE_BT,
+ lambda/band->threshold, INFINITY, NULL, 0);
+ /* Estimate rd on average as 9 bits for CB and sf + spread energy * lambda/thr */
+ dist2 += 9+band->energy/(band->spread*band->spread)*lambda/band->threshold;
+ }
+ energy_ratio = sfb_energy/pns_energy; /* Compensates for quantization error */
+ sce->pns_ener[w*16+g] = energy_ratio*sfb_energy;
+ if (energy_ratio > 0.85f && energy_ratio < 1.25f && dist1/dist2 > dist_thresh) {
+ energy_ratio = pns_tgt_energy/pns_energy; /* Compensates for quantization error */
+ sce->pns_ener[w*16+g] = energy_ratio*pns_tgt_energy;
+ if (energy_ratio > 0.85f && energy_ratio < 1.25f && (sce->zeroes[w*16+g] || !sce->band_alt[w*16+g] || dist2*dist_thresh < dist1)) {
+ sce->band_type[w*16+g] = NOISE_BT;
+ sce->zeroes[w*16+g] = 0;
+ if (sce->band_type[w*16+g-1] != NOISE_BT && /* Prevent holes */
+ sce->band_type[w*16+g-2] == NOISE_BT) {
+ sce->band_type[w*16+g-1] = NOISE_BT;
+ sce->zeroes[w*16+g-1] = 0;
}
- if (spread > spread_threshold*sce->ics.group_len[w] &&
- ((sce->zeroes[w*16+g] && energy >= threshold) ||
- energy < threshold*thr_mult*sce->ics.group_len[w])) {
- sce->band_type[w*16+g] = NOISE_BT;
- sce->pns_ener[w*16+g] = energy / sce->ics.group_len[w];
- sce->zeroes[w*16+g] = 0;
- }
}
- start += sce->ics.swb_sizes[g];
+ }
}
}
}

View File

@ -1,14 +1,16 @@
$OpenBSD: patch-libavcodec_aacenctab_h,v 1.1 2015/09/23 09:16:45 ajacoutot Exp $
$OpenBSD: patch-libavcodec_aacenctab_h,v 1.2 2015/09/27 06:35:33 ajacoutot Exp $
AAC encoder: simplify and speed up find_min_book
--- libavcodec/aacenctab.h.orig Wed Sep 23 03:53:28 2015
+++ libavcodec/aacenctab.h Wed Sep 23 03:53:35 2015
avcodec/aacenctab: Make aac_maxval_cb const
--- libavcodec/aacenctab.h.orig Mon Sep 7 21:58:01 2015
+++ libavcodec/aacenctab.h Fri Sep 25 15:47:31 2015
@@ -110,4 +110,8 @@ static const uint8_t aac_cb_in_map[CB_TOT_ALL+1] = {0,
static const uint8_t aac_cb_range [12] = {0, 3, 3, 3, 3, 9, 9, 8, 8, 13, 13, 17};
static const uint8_t aac_cb_maxval[12] = {0, 1, 1, 2, 2, 4, 4, 7, 7, 12, 12, 16};
+static unsigned char aac_maxval_cb[] = {
+static const unsigned char aac_maxval_cb[] = {
+ 0, 1, 3, 5, 5, 7, 7, 7, 9, 9, 9, 9, 9, 11
+};
+