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)]
74#define NMR_PNS_HOLE_FRAC 0.5f
75#define NMR_PNS_HOLE_SPREAD 0.5f
79#define NMR_RC_K_CBR 0.5f
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
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)
207 for (
int o = 0; o < maxn && lo + o*step <=
SCALE_MAX_POS; o++) {
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.3f, 0.0f, 1.0f);
335 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
349 if (nz && ener > 0.0f && uplim > 0.0f)
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-9f);
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)
512 for (
int b = 0;
b < t->
nbnd;
b++) {
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.0f)
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.0f;
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);
801 s->nmr->lam_rc =
av_clipf(lam, 1e-4f, 1e4f);
802 s->nmr->lam_slew =
s->nmr->lam_rc;
809 for (
int k = 0; k < nsl; k++) {
815 for (
int b = 1;
b < t->
nbnd;
b++) {
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.0f, 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);
AAC definitions and structures.
#define SCALE_MAX_DIFF
maximum scalefactor difference allowed by standard
@ INTENSITY_BT
Scalefactor data are intensity stereo positions (in phase).
@ INTENSITY_BT2
Scalefactor data are intensity stereo positions (out of phase).
@ RESERVED_BT
Band types following are encoded differently from others.
@ NOISE_BT
Spectral data are scaled white noise not coded in the bitstream.
#define SCALE_MAX_POS
scalefactor index maximum value
static void search_for_quantizers_nmr(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
static float nmr_solve_slots(AACEncContext *s, NMRSlot *const *sl, int nsl, int step, int destbits, float lo_l, float hi_l, int iters)
static int nmr_setup_channel(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, NMRSlot *t)
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)
#define NMR_PNS_HOLE_SPREAD
#define NMR_PNS_HOLE_FRAC
static int nmr_slot_bits(const NMRSlot *t, const int(*nb)[NMR_NCAND], int step)
static int nmr_eval_slots(AACEncContext *s, NMRSlot *const *sl, int nsl, int step, float lam)
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)
#define NMR_SFBITS(d)
AAC encoder NMR scalefactor coder.
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 act[0..nact-1] (indices into the per-band curves nd/nb),...
static void nmr_commit_channel(AACEncContext *s, NMRSlot *t)
static void nmr_bail_channel(SingleChannelElement *sce)
void ff_quantize_band_cost_cache_init(struct AACEncContext *s)
#define NMR_NCAND
per-band scalefactor candidates above the finest codeable sf (NMR coder)
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)
static void ff_init_nextband_map(const SingleChannelElement *sce, uint8_t *nextband)
static int find_min_book(float maxval, int sf)
static float find_max_val(int group_len, int swb_size, const float *scaled)
static uint8_t coef2minsf(float coef)
Return the minimum scalefactor where the quantized coef does not clip.
static int ff_sfdelta_can_remove_band(const SingleChannelElement *sce, const uint8_t *nextband, int prev_sf, int band)
const uint8_t ff_aac_scalefactor_bits[121]
static const int8_t filt[NUMTAPS *2]
static float win(SuperEqualizerContext *s, float n, int N)
Libavcodec external API header.
#define i(width, name, range_min, range_max)
static __device__ float sqrtf(float a)
float fminf(float, float)
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
static void scale(int *out, const int *in, const int w, const int h, const int shift)
int frames_since_short
long-block frames since the last short run (the "gap"): large = isolated transient
NMRSlot slot[2]
pair slots (solo solves use slot 0)
float run_burst
transient bit-burst factor, set at run start and held across the short run
int rc_fill
virtual bit reservoir fill, + = bits saved vs nominal
int rc_gl
rc_global latched at frame start: the corridor bootstrap must not flip the CPE defer logic between ch...
float lam_short_ema
smoothed operating lambda of short frames
int64_t rc_frame_num
frame the reservoir was last advanced for
float lam_long_ema
smoothed operating lambda of long frames
int pending
slot 0 holds a deferred first channel
int prev_was_short
previous frame was a short block (for run-start detection)
float lam_rc
global-lambda rate control: operating lambda, 0 until bootstrapped
int rc_fill_seeded
reservoir seeded full at stream start (decoder buffer starts full)
int pair
current element is a CPE: pool the pair budget
int nb_channels
Number of channels in this layout.
main external API structure.
AVChannelLayout ch_layout
Audio channel layout.
int global_quality
Global quality for codecs which cannot change it per frame.
int64_t frame_num
Frame counter, set by libavcodec.
int bit_rate_tolerance
number of bits the bitstream is allowed to diverge from the reference.
int64_t bit_rate
the average bitrate
int sample_rate
samples per second
int flags
AV_CODEC_FLAG_*.
single band psychoacoustic information
uint8_t max_sfb
number of scalefactor bands per group
int num_swb
number of scalefactor window bands
const uint8_t * swb_sizes
table of scalefactor band sizes for a particular window
enum WindowSequence window_sequence[2]
const uint16_t * swb_offset
table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular wind...
NMR coder per-band candidate cost curves (~96 KiB) and rate-control carry-over.
float pspread[128]
band tonality spread (1 = noise)
float tnsg[128]
TNS synthesis gain per band for THIS solve (1 = uncovered), M/S-aware (pair max)
int bst[128]
window group, swb, coef start
struct SingleChannelElement * sce
int bnc[128]
number of candidates
float thr_real[128]
real masking threshold (PNS gates)
uint8_t is_pns[128]
band coded as noise
int si
curve-bank index (nd/nb slot)
float pener[128]
band energy (PNS noise target)
float thr[128]
allocation-law effective threshold
int bidx[128]
sce band index (w*16+g)
int nbnd
coded-band count, 0 = nothing codeable
int blo[128]
finest candidate scalefactor
int act[128]
active (non-PNS) band coding order
int is8
EIGHT_SHORT frame.
int cur_ch
encoder channel index (psy/cache context)
Single Channel Element - used for both SCE and LFE elements.
uint8_t zeroes[128]
band is not coded
float coeffs[1024]
coefficients for IMDCT, maybe processed
uint8_t can_pns[128]
band is allowed to PNS (informative)
float pns_ener[128]
Noise energy values.
enum BandType band_type[128]
band types
IndividualChannelStream ics
int sf_idx[128]
scalefactor indices
static double cb(void *priv, double x, double y)
static float mean(const float *input, int size)
static double b0(void *priv, double x, double y)
static int bias(int x, int c)