Some more AAC stuffs.
from Brad (maintainer)
This commit is contained in:
parent
5a5e26ea83
commit
c9948ce5a9
@ -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
|
||||
|
@ -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];
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
+};
|
||||
+
|
||||
|
Loading…
Reference in New Issue
Block a user