Go to the documentation of this file.
43 #ifndef AVCODEC_AACCODER_NMR_H
44 #define AVCODEC_AACCODER_NMR_H
58 #define NMR_SFBITS(d) ff_aac_scalefactor_bits[av_clip((d) + SCALE_DIFF_ZERO, 0, 2*SCALE_MAX_DIFF)]
70 #define NMR_PNS_BITS 9
74 #define NMR_PNS_HOLE_FRAC 0.5f
75 #define NMR_PNS_HOLE_SPREAD 0.5f
79 #define NMR_RC_K_CBR 0.5f
81 #define NMR_RC_ITERS 8
84 #define NMR_RC_CORR 1.5f
87 #define NMR_CBR_BUF 1536
91 #define NMR_SLEW_RUN 1.15f
92 #define NMR_RC_CITERS 3
96 #define NMR_TRANS_PM 2.0f
100 #define NMR_ZERO_STICKY 0.5f
104 #define NMR_BURST_GAP 10
105 #define NMR_BURST_GAIN 8.0f
108 #define NMR_SHORT_BOOST 2.0f
109 #define NMR_RC_FITERS 4
110 #define NMR_RC_TRACK 0.1f
113 #define NMR_PNS_NDGATE 4.0f
117 #define NMR_PNS_MAX_ET 8.0f
121 #define NMR_PNS_LAM 100.0f
124 #define NMR_PNS_ENTER 0.7f
125 #define NMR_PNS_STAY 1.4f
129 #define NMR_PNS_OFF 4
140 const int *blo,
const int *bnc,
int step,
141 const int *act,
int nact,
int destbits,
int *chosen,
142 float lo_l,
float hi_l,
int iters)
152 for (
int it = 0;
it < iters;
it++) {
153 lam =
sqrtf(lo_l * hi_l);
158 for (
int o = 0; o < bnc[
b0]; o++)
159 dp[o] = nd[
b0][o] + lam * nb[
b0][o];
161 for (
int k = 1; k < nact; k++) {
162 int b = act[k], pb = act[k-1];
163 memcpy(dpp, dp,
sizeof(dp));
164 for (
int o = 0; o < bnc[
b]; o++)
165 node[o] = nd[
b][o] + lam * nb[
b][o];
167 s->aacdsp.nmr_trellis_step(dp, bp[k], dpp, node, lamsf,
168 bnc[
b], bnc[pb], blo[
b] - blo[pb],
step,
173 int beo = 0,
b = act[nact-1];
175 for (
int o = 0; o < bnc[
b]; o++)
176 if (dp[o] < bec) { bec = dp[o]; beo = o; }
178 for (
int k = nact-1; k > 0; k--)
179 chosen[act[k-1]] = bp[k][chosen[act[k]]];
183 for (
int k = 0; k < nact; k++)
184 total += nb[act[k]][chosen[act[k]]];
185 for (
int k = 1; k < nact; k++)
186 total +=
NMR_SFBITS((blo[act[k]]+chosen[act[k]]*
step) - (blo[act[k-1]]+chosen[act[k-1]]*
step));
192 if (total > destbits)
203 int start,
int lo,
int step,
int maxn,
float invthr,
204 float maxval,
float *nd_row,
int *nb_row)
219 nd_row[ncand] = (dist - btot) * invthr;
220 nb_row[ncand] = btot;
230 for (
int i = 0;
i < 128;
i++) {
247 int allz = 0, cutoff = 1024, nbnd = 0;
249 uint8_t *zprev =
s->nmr->zero_prev[
s->cur_channel & 15];
251 memset(zprev, 1, 128);
266 const float pm_p1 = 0.1f, pm_p2 = 2.0f, pm_p3 = 4.0f;
268 float t1 = FLT_MAX, t2 = FLT_MAX;
271 float th =
b->threshold;
273 b->threshold =
FFMAX(
c, th*pm_p1);
279 float sum = 0.0f, esum = 0.0f;
int n = 0;
282 if (
b->energy >
b->threshold &&
b->threshold > 0.0f) { sum +=
b->threshold; esum +=
b->energy; n++; }
290 if (
b->energy >
b->threshold &&
b->threshold > 0.0f)
300 float a_ae = 0.443f, a_at = 0.111f;
303 a_ae += (0.35f - a_ae) *
s->nmr->press;
304 a_at += (0.3f - a_at) *
s->nmr->press;
309 float uplim = 0.0f, ener = 0.0f, spread = 2.0f;
322 if ((t->
cur_ch & 1) &&
s->nmr &&
s->nmr->pair &&
323 s->nmr->smode_band[(t->
cur_ch >> 1) & 7][
w*16+
g] == 1) {
324 const FFPsyBand *
mb = &
s->psy.ch[
s->cur_channel - 1].psy_bands[
w*16+
g];
328 const FFPsyBand *bb = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
332 zthr_mul *= 0.25f + 0.75f *
av_clipf(ratio / 0.3
f, 0.0
f, 1.0
f);
335 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
349 if (nz && ener > 0.0
f && uplim > 0.0
f)
350 uplim =
expf(a_ae * logf(ener) + a_at * logf(uplim));
351 t->
thr[
w*16+
g] = uplim;
364 s->nmr->thr_prev_ok[ci]) {
366 if (t->
thr[
g] > 0.0f &&
s->nmr->thr_prev[ci][
g] > 0.0f)
370 s->nmr->thr_prev[ci][
g] = t->
thr[
g];
371 s->nmr->thr_prev_ok[ci] = 1;
373 s->nmr->thr_prev_ok[t->
cur_ch & 15] = 0;
376 s->aacdsp.abs_pow34(
s->scoefs, sce->
coeffs, 1024);
381 for (
int i = 0;
i < 128;
i++)
385 for (
int w = 0;
w < 8;
w++) {
392 for (
int g =
FFMIN(bottom2, mmm2);
g <
FFMIN(top2, mmm2);
g++) {
396 const FFPsyBand *pb = &
s->psy.ch[
s->cur_channel].psy_bands[
w*16+
g];
397 for (
int k = s0; k < s1; k++)
423 float invthr = 1.0f /
FFMAX(t->
thr[
w*16+
g], 1e-9
f);
425 invthr, t->
maxvals[
w*16+
g], nd[nbnd], nb[nbnd]);
426 if (t->
tnsg[
w*16+
g] > 1.0f)
427 for (
int o = 0; o < ncand; o++)
428 nd[nbnd][o] *= t->
tnsg[
w*16+
g];
438 t->
bst[nbnd] = start;
440 t->
bnc[nbnd] = ncand;
449 for (
int b = 0;
b < nbnd;
b++) {
461 for (
int k = 0; k < t->
nact; k++)
463 for (
int k = 1; k < t->
nact; k++)
473 for (
int k = 0; k < nsl; k++) {
488 int destbits,
float lo_l,
float hi_l,
int iters)
491 for (
int it = 0;
it < iters;
it++) {
492 lam =
sqrtf(lo_l * hi_l);
497 if (total > destbits)
526 int tot = 0, prevb = -1;
527 for (
int b = 0;
b < t->
nbnd;
b++) {
535 s->nmr->counted[t->
cur_ch] = tot;
542 uint8_t nextband[128];
579 int last = sce->
sf_idx[0];
596 const float lambda,
NMRSlot *
const *sl,
int nsl,
597 int chans,
int rc_eligible,
int rc_global,
598 int rc_rate_frame,
int rc_bmax)
602 int destbits = avctx->
bit_rate * 1024.0 / avctx->
sample_rate / bch * (lambda / 120.f) * chans;
605 float rc_off = 1.0f, lam_dem = 0.0f;
607 for (
int k = 0; k < nsl; k++)
608 is8_any |= sl[k]->is8;
610 if (
s->psy.bitres.alloc >= 0)
611 destbits =
s->psy.bitres.alloc *
613 if (rc_global &&
s->psy.bitres.alloc >= 0) {
616 destbits = (rr +
av_clipd(
s->nmr->rc_fill / 2.0, -0.3 * rr, 0.3 * rr)) * chans /
s->channels;
617 }
else if (rc_eligible &&
s->psy.bitres.alloc >= 0) {
621 destbits =
FFMIN(destbits, 5800 * chans);
624 if (
s->nmr->side_inited)
625 destbits =
av_clip(destbits - (
int)(
s->nmr->side_ema * chans /
s->channels), 64, 5800 * chans);
629 if (
s->nmr->run_burst > 1.0f) {
630 int extra = destbits * (
s->nmr->run_burst - 1.0f);
631 int avail =
FFMAX(0, (
int)((
s->nmr->rc_fill + rc_bmax / 2) * (
int64_t)chans /
s->channels));
632 destbits =
av_clip(destbits +
FFMIN(extra, avail), 64, 6800 * chans);
640 int tot, hardcap, rc_cap;
643 cen =
s->nmr->lam_rc * rc_off;
647 if (is8_any &&
s->nmr->run_burst > 1.0f)
648 lo /=
s->nmr->run_burst;
653 for (
int k = 0; k < nsl; k++)
655 hardcap =
av_clip((
int)(5800.
f *
FFMIN(1.
f, lambda / 120.
f)), 256, 5800) * chans;
657 rc_cap =
FFMIN(hardcap, (
s->nmr->rc_fill + rc_rate_frame + rc_bmax) * chans /
s->channels);
664 float lam0 =
s->nmr->lam[sl[0]->
cur_ch];
668 if (lam < lam0/16.0f || lam > lam0*16.0
f)
683 for (
int k = 0; k < nsl; k++) {
690 s->aacdsp.abs_pow34(
s->scoefs, t->
sce->
coeffs, 1024);
692 for (
int b = 0;
b < t->
nbnd;
b++) {
700 for (
int o = 0; o < ncand; o++)
717 int hardcap =
av_clip((
int)(5800.
f *
FFMIN(1.
f, lambda / 120.
f)), 256, 5800) * chans;
719 for (
int k = 0; k < nsl; k++)
721 rc_cap =
FFMIN(hardcap, (
s->nmr->rc_fill + rc_rate_frame + rc_bmax) * chans /
s->channels);
725 if (
s->nmr->lam_slew > 0.0f) {
731 kdn = (is8_any &&
s->nmr->run_burst > 1.0f) ?
NMR_SLEW *
s->nmr->run_burst :
733 if (lam >
s->nmr->lam_slew * kup || lam < s->nmr->lam_slew / kdn) {
734 lam =
av_clipf(lam,
s->nmr->lam_slew / kdn,
s->nmr->lam_slew * kup);
742 s->nmr->lam_slew = lam;
745 for (
int k = 0; k < nsl; k++)
746 s->nmr->lam[sl[k]->
cur_ch] = lam;
749 float ndsum = 0.0f;
int ndn = 0;
750 for (
int k = 0; k < nsl; k++) {
753 for (
int b_ = 0; b_ < t->
nact; b_++) {
762 if (ndn >= 8 && !is8_any) {
763 float nd = ndsum / ndn;
764 s->nmr->nd_ema =
s->nmr->nd_ema > 0.0f ?
765 0.95f *
s->nmr->nd_ema + 0.05f * nd : nd;
769 float *ema = is8_any ? &
s->nmr->lam_short_ema : &
s->nmr->lam_long_ema;
770 *ema = *ema > 0.0f ? 0.9f * *ema + 0.1f * lam : lam;
774 s->nmr->lam_floor =
s->nmr->lam_floor > 0.0f ?
775 fminf(
s->nmr->lam_floor * 1.02f, lam) : lam;
780 ramp =
s->nmr->lam_long_ema > 0.0f ?
782 (350.0f *
scale - 120.0f *
scale), 0.0f, 1.0f) : 0.0
f;
784 if (
s->nmr->nd_ema > 0.0f)
785 ramp *=
av_clipf((
s->nmr->lam_long_ema *
s->nmr->nd_ema - 60.0f) /
786 (120.0f - 60.0f), 0.0f, 1.0f);
787 s->nmr->press = ramp;
794 }
else if (rc_eligible) {
798 for (
int k = 0; k < nsl; k++)
799 nbnd_max =
FFMAX(nbnd_max, sl[k]->nbnd);
802 s->nmr->lam_slew =
s->nmr->lam_rc;
809 for (
int k = 0; k < nsl; k++) {
818 float nmr_pns, cost_keep, cost_pns, frac;
822 int was =
s->nmr->pns_prev[t->
cur_ch & 15][bi];
824 int want = 0, force_exit = 0;
829 }
else if (lam > pns_lam) {
839 nmr_pns =
FFMAX(0.0
f, t->
pener[bi] * (1.0f - spread*spread))
843 want = cost_pns < cost_keep *
bias;
848 uint8_t *ron = &
s->nmr->pns_run_on [t->
cur_ch & 15][bi];
849 uint8_t *roff = &
s->nmr->pns_run_off[t->
cur_ch & 15][bi];
851 if (want) {
if (*ron < 255) (*ron)++; *roff = 0; }
852 else {
if (*roff < 255) (*roff)++; *ron = 0; }
869 for (
int b = 0;
b < t->
nbnd;
b++)
873 pns_total += pns_count;
887 for (
int k = 0; k < nsl; k++) {
889 uint8_t *pp =
s->nmr->pns_prev[t->
cur_ch & 15];
890 uint8_t now[128] = {0};
891 for (
int b = 0;
b < t->
nbnd;
b++)
894 memcpy(pp, now, 128);
896 for (
int k = 0; k < nsl; k++)
916 int rc_global, defer;
919 s->nmr->counted[
s->cur_channel] = 0;
963 rc_global = rc_eligible && n->
rc_gl;
967 defer = n->
pair && rc_global;
984 int nsl = 0, chans = 1;
989 sl[nsl++] = &n->
slot[0];
991 sl[nsl++] = &n->
slot[1];
992 }
else if (t->
nact) {
998 rc_eligible, rc_global, rc_rate_frame, rc_bmax);
int is8
EIGHT_SHORT frame.
int cur_ch
encoder channel index (psy/cache context)
float tnsg[128]
TNS synthesis gain per band for THIS solve (1 = uncovered), M/S-aware (pair max)
uint8_t can_pns[128]
band is allowed to PNS (informative)
int frames_since_short
long-block frames since the last short run (the "gap"): large = isolated transient
int sample_rate
samples per second
static double cb(void *priv, double x, double y)
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
uint8_t zeroes[128]
band is not coded
int64_t rc_frame_num
frame the reservoir was last advanced for
int si
curve-bank index (nd/nb slot)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
float thr[128]
allocation-law effective threshold
static void nmr_commit_channel(AACEncContext *s, NMRSlot *t)
static int ff_sfdelta_can_remove_band(const SingleChannelElement *sce, const uint8_t *nextband, int prev_sf, int band)
int nb_channels
Number of channels in this layout.
#define SCALE_MAX_POS
scalefactor index maximum value
static float win(SuperEqualizerContext *s, float n, int N)
int num_swb
number of scalefactor window bands
int blo[128]
finest candidate scalefactor
float coeffs[1024]
coefficients for IMDCT, maybe processed
AVChannelLayout ch_layout
Audio channel layout.
int flags
AV_CODEC_FLAG_*.
int bit_rate_tolerance
number of bits the bitstream is allowed to diverge from the reference.
IndividualChannelStream ics
int pending
slot 0 holds a deferred first channel
int rc_fill
virtual bit reservoir fill, + = bits saved vs nominal
static int nmr_setup_channel(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, NMRSlot *t)
@ NOISE_BT
Spectral data are scaled white noise not coded in the bitstream.
int global_quality
Global quality for codecs which cannot change it per frame.
const uint8_t * swb_sizes
table of scalefactor band sizes for a particular window
@ INTENSITY_BT2
Scalefactor data are intensity stereo positions (out of phase).
float fminf(float, float)
static int nmr_band_curve(AACEncContext *s, SingleChannelElement *sce, int w, int g, int start, int lo, int step, int maxn, float invthr, float maxval, float *nd_row, int *nb_row)
static void search_for_quantizers_nmr(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
static void nmr_bail_channel(SingleChannelElement *sce)
int bst[128]
window group, swb, coef start
float lam_rc
global-lambda rate control: operating lambda, 0 until bootstrapped
static float quantize_band_cost_cached(struct AACEncContext *s, int w, int g, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits, float *energy, int rtz)
@ INTENSITY_BT
Scalefactor data are intensity stereo positions (in phase).
float pener[128]
band energy (PNS noise target)
static int bias(int x, int c)
int64_t bit_rate
the average bitrate
struct SingleChannelElement * sce
single band psychoacoustic information
static __device__ float sqrtf(float a)
static void ff_init_nextband_map(const SingleChannelElement *sce, uint8_t *nextband)
static float nmr_solve(AACEncContext *s, const float(*nd)[NMR_NCAND], const int(*nb)[NMR_NCAND], const int *blo, const int *bnc, int step, const int *act, int nact, int destbits, int *chosen, float lo_l, float hi_l, int iters)
Viterbi over the coding sequence act0..nact-1, with lambda binary-searched so the coded size ~ destbi...
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int sf_idx[128]
scalefactor indices
int rc_fill_seeded
reservoir seeded full at stream start (decoder buffer starts full)
static int nmr_slot_bits(const NMRSlot *t, const int(*nb)[NMR_NCAND], int step)
int pair
current element is a CPE: pool the pair budget
const uint8_t ff_aac_scalefactor_bits[121]
static uint8_t coef2minsf(float coef)
Return the minimum scalefactor where the quantized coef does not clip.
enum WindowSequence window_sequence[2]
#define i(width, name, range_min, range_max)
int prev_was_short
previous frame was a short block (for run-start detection)
uint8_t is_pns[128]
band coded as noise
#define NMR_NCAND
per-band scalefactor candidates above the finest codeable sf (NMR coder)
int act[128]
active (non-PNS) band coding order
float pspread[128]
band tonality spread (1 = noise)
enum BandType band_type[128]
band types
#define SCALE_MAX_DIFF
maximum scalefactor difference allowed by standard
float pns_ener[128]
Noise energy values.
static float nmr_solve_slots(AACEncContext *s, NMRSlot *const *sl, int nsl, int step, int destbits, float lo_l, float hi_l, int iters)
#define NMR_PNS_HOLE_FRAC
Single Channel Element - used for both SCE and LFE elements.
int bnc[128]
number of candidates
static int find_min_book(float maxval, int sf)
int nbnd
coded-band count, 0 = nothing codeable
const uint16_t * swb_offset
table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular wind...
float thr_real[128]
real masking threshold (PNS gates)
int bidx[128]
sce band index (w*16+g)
static const int8_t filt[NUMTAPS *2]
float lam_long_ema
smoothed operating lambda of long frames
int64_t frame_num
Frame counter, set by libavcodec.
float run_burst
transient bit-burst factor, set at run start and held across the short run
@ RESERVED_BT
Band types following are encoded differently from others.
main external API structure.
NMRSlot slot[2]
pair slots (solo solves use slot 0)
static float mean(const float *input, int size)
static void nmr_solve_group(AVCodecContext *avctx, AACEncContext *s, const float lambda, NMRSlot *const *sl, int nsl, int chans, int rc_eligible, int rc_global, int rc_rate_frame, int rc_bmax)
static float find_max_val(int group_len, int swb_size, const float *scaled)
#define NMR_PNS_HOLE_SPREAD
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s it
#define NMR_SFBITS(d)
AAC encoder NMR scalefactor coder.
static void scale(int *out, const int *in, const int w, const int h, const int shift)
NMR coder per-band candidate cost curves (~96 KiB) and rate-control carry-over.
int rc_gl
rc_global latched at frame start: the corridor bootstrap must not flip the CPE defer logic between ch...
uint8_t max_sfb
number of scalefactor bands per group
static double b0(void *priv, double x, double y)
float lam_short_ema
smoothed operating lambda of short frames
void ff_quantize_band_cost_cache_init(struct AACEncContext *s)
static int nmr_eval_slots(AACEncContext *s, NMRSlot *const *sl, int nsl, int step, float lam)