Go to the documentation of this file.
57 #define NOISE_SPREAD_THRESHOLD 0.9f
61 #define NOISE_LAMBDA_REPLACE 1.948f
78 int win,
int group_len,
const float lambda)
85 const int run_esc = (1 <<
run_bits) - 1;
87 int stackrun[120], stackcb[120], stack_len;
91 s->abs_pow34(
s->scoefs, sce->
coeffs, 1024);
98 for (swb = 0; swb < max_sfb; swb++) {
107 float minrd = next_minrd;
108 int mincb = next_mincb;
112 float cost_stay_here, cost_get_here;
121 for (
w = 0;
w < group_len;
w++) {
122 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
win+
w)*16+swb];
124 &
s->scoefs[start +
w*128],
size,
128 cost_stay_here = path[swb][
cb].
cost + rd;
129 cost_get_here = minrd + rd +
run_bits + 4;
133 if (cost_get_here < cost_stay_here) {
135 path[swb+1][
cb].
cost = cost_get_here;
136 path[swb+1][
cb].
run = 1;
139 path[swb+1][
cb].
cost = cost_stay_here;
142 if (path[swb+1][
cb].cost < next_minrd) {
143 next_minrd = path[swb+1][
cb].
cost;
155 if (path[max_sfb][
cb].cost < path[max_sfb][idx].cost)
161 stackrun[stack_len] = path[ppos][
cb].
run;
162 stackcb [stack_len] =
cb;
164 ppos -= path[ppos][
cb].
run;
169 for (
i = stack_len - 1;
i >= 0;
i--) {
175 for (j = 0; j < count; j++) {
179 while (count >= run_esc) {
193 #define TRELLIS_STAGES 121
194 #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
199 int prevscaler_n = -255, prevscaler_i = 0;
211 if (prevscaler_n == -255)
239 int q,
w, w2,
g, start = 0;
246 float q0f = FLT_MAX, q1f = 0.0f, qnrgf = 0.0f;
247 int q0,
q1, qcnt = 0;
249 for (
i = 0;
i < 1024;
i++) {
250 float t = fabsf(sce->
coeffs[
i]);
279 }
else if (
q1 > q1high) {
292 paths[0][
i].
cost = 0.0f;
293 paths[0][
i].
prev = -1;
298 paths[j][
i].
prev = -2;
302 s->abs_pow34(
s->scoefs, sce->
coeffs, 1024);
306 const float *coefs = &sce->
coeffs[start];
310 bandaddr[idx] =
w * 16 +
g;
314 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
322 float t = fabsf(coefs[w2*128+
i]);
324 qmin =
FFMIN(qmin, t);
325 qmax =
FFMAX(qmax, t);
329 int minscale, maxscale;
338 if (minscale == maxscale) {
343 for (q = minscale; q < maxscale; q++) {
347 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
351 minrd =
FFMIN(minrd, dist);
353 for (
i = 0;
i <
q1 -
q0;
i++) {
355 cost = paths[idx - 1][
i].
cost + dist
357 if (cost < paths[idx][q].cost) {
358 paths[idx][q].
cost = cost;
359 paths[idx][q].
prev =
i;
364 for (q = 0; q <
q1 -
q0; q++) {
365 paths[idx][q].
cost = paths[idx - 1][q].
cost + 1;
366 paths[idx][q].
prev = q;
375 mincost = paths[idx][0].
cost;
378 if (paths[idx][
i].cost < mincost) {
379 mincost = paths[idx][
i].
cost;
384 sce->
sf_idx[bandaddr[idx]] = minq +
q0;
385 minq =
FFMAX(paths[idx][minq].prev, 0);
399 int start = 0,
i,
w, w2,
g;
401 float dists[128] = { 0 }, uplims[128] = { 0 };
403 int fflag, minscaler;
410 destbits =
FFMIN(destbits, 5800);
417 float uplim = 0.0f, energy = 0.0f;
419 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
428 uplims[
w*16+
g] = uplim *512;
432 minthr =
FFMIN(minthr, uplim);
449 s->abs_pow34(
s->scoefs, sce->
coeffs, 1024);
455 const float *scaled =
s->scoefs + start;
465 minscaler = sce->
sf_idx[0];
467 qstep = its ? 1 : 32;
474 const float *coefs = sce->
coeffs + start;
475 const float *scaled =
s->scoefs + start;
497 dists[
w*16+
g] = dist -
bits;
506 if (tbits > destbits) {
507 for (
i = 0;
i < 128;
i++)
508 if (sce->
sf_idx[
i] < 218 - qstep)
511 for (
i = 0;
i < 128;
i++)
512 if (sce->
sf_idx[
i] > 60 - qstep)
516 if (!qstep && tbits > destbits*1.02 && sce->
sf_idx[0] < 217)
526 if (dists[
w*16+
g] > uplims[
w*16+
g] && sce->
sf_idx[
w*16+
g] > 60) {
540 }
while (fflag && its < 10);
548 int bandwidth, cutoff;
549 float *PNS = &
s->scoefs[0*128], *PNS34 = &
s->scoefs[1*128];
550 float *NOR34 = &
s->scoefs[3*128];
552 const float lambda =
s->lambda;
553 const float freq_mult = avctx->
sample_rate*0.5f/wlen;
556 const float dist_bias = av_clipf(4.
f * 120 / lambda, 0.25
f, 4.0
f);
557 const float pns_transient_energy_r =
FFMIN(0.7
f, lambda / 140.
f);
564 float rate_bandwidth_multiplier = 1.5f;
565 int prev = -1000, prev_sf = -1;
567 ? (refbits * rate_bandwidth_multiplier * avctx->
sample_rate / 1024)
570 frame_bit_rate *= 1.15f;
573 bandwidth = avctx->
cutoff;
578 cutoff = bandwidth * 2 * wlen / avctx->
sample_rate;
586 float dist1 = 0.0f, dist2 = 0.0f, noise_amp;
587 float pns_energy = 0.0f, pns_tgt_energy, energy_ratio, dist_thresh;
588 float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f;
589 float min_energy = -1.0f, max_energy = 0.0f;
591 const float freq = (start-wstart)*freq_mult;
599 band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
600 sfb_energy += band->
energy;
604 min_energy = max_energy = band->
energy;
622 ((sce->
zeroes[
w*16+
g] || !sce->
band_alt[
w*16+
g]) && sfb_energy < threshold*sqrtf(1.0
f/freq_boost)) || spread < spread_threshold ||
623 (!sce->
zeroes[
w*16+
g] && sce->
band_alt[
w*16+
g] && sfb_energy > threshold*thr_mult*freq_boost) ||
624 min_energy < pns_transient_energy_r * max_energy ) {
631 pns_tgt_energy = sfb_energy*
FFMIN(1.0
f, spread*spread);
632 noise_sfi = av_clip(
roundf(
log2f(pns_tgt_energy)*2), -100, 155);
643 float band_energy, scale, pns_senergy;
645 band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
648 PNS[
i] =
s->random_state;
650 band_energy =
s->fdsp->scalarproduct_float(PNS, PNS, sce->
ics.
swb_sizes[
g]);
651 scale = noise_amp/sqrtf(band_energy);
652 s->fdsp->vector_fmul_scalar(PNS, PNS, scale, sce->
ics.
swb_sizes[
g]);
653 pns_senergy =
s->fdsp->scalarproduct_float(PNS, PNS, sce->
ics.
swb_sizes[
g]);
654 pns_energy += pns_senergy;
671 energy_ratio = pns_tgt_energy/pns_energy;
672 sce->
pns_ener[
w*16+
g] = energy_ratio*pns_tgt_energy;
673 if (sce->
zeroes[
w*16+
g] || !sce->
band_alt[
w*16+
g] || (energy_ratio > 0.85f && energy_ratio < 1.25f && dist2 < dist1)) {
690 int bandwidth, cutoff;
691 const float lambda =
s->lambda;
692 const float freq_mult = avctx->
sample_rate*0.5f/wlen;
694 const float pns_transient_energy_r =
FFMIN(0.7
f, lambda / 140.
f);
701 float rate_bandwidth_multiplier = 1.5f;
703 ? (refbits * rate_bandwidth_multiplier * avctx->
sample_rate / 1024)
706 frame_bit_rate *= 1.15f;
709 bandwidth = avctx->
cutoff;
714 cutoff = bandwidth * 2 * wlen / avctx->
sample_rate;
719 float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f;
720 float min_energy = -1.0f, max_energy = 0.0f;
722 const float freq = start*freq_mult;
724 if (freq < NOISE_LOW_LIMIT || start >= cutoff) {
729 band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
730 sfb_energy += band->
energy;
734 min_energy = max_energy = band->
energy;
747 if (sfb_energy < threshold*sqrtf(1.5
f/freq_boost) || spread < spread_threshold || min_energy < pns_transient_energy_r * max_energy) {
758 int start = 0,
i,
w, w2,
g, sid_sf_boost, prev_mid, prev_side;
759 uint8_t nextband0[128], nextband1[128];
760 float *
M =
s->scoefs + 128*0, *
S =
s->scoefs + 128*1;
761 float *L34 =
s->scoefs + 128*2, *R34 =
s->scoefs + 128*3;
762 float *M34 =
s->scoefs + 128*4, *S34 =
s->scoefs + 128*5;
763 const float lambda =
s->lambda;
764 const float mslambda =
FFMIN(1.0
f, lambda / 120.
f);
774 prev_mid = sce0->
sf_idx[0];
775 prev_side = sce1->
sf_idx[0];
783 float Mmax = 0.0f, Smax = 0.0f;
789 + sce1->
coeffs[start+(
w+w2)*128+
i]) * 0.5;
796 Mmax =
FFMAX(Mmax, M34[
i]);
797 Smax =
FFMAX(Smax, S34[
i]);
801 for (sid_sf_boost = 0; sid_sf_boost < 4; sid_sf_boost++) {
802 float dist1 = 0.0f, dist2 = 0.0f;
822 midcb =
FFMAX(1,midcb);
823 sidcb =
FFMAX(1,sidcb);
826 FFPsyBand *band0 = &
s->psy.ch[
s->cur_channel+0].psy_bands[(
w+w2)*16+
g];
827 FFPsyBand *band1 = &
s->psy.ch[
s->cur_channel+1].psy_bands[(
w+w2)*16+
g];
832 + sce1->
coeffs[start+(
w+w2)*128+
i]) * 0.5;
882 }
else if (
B1 >
B0) {
enum BandType band_alt[128]
alternative band type (used by encoder)
static const uint8_t q1[256]
static av_always_inline int lcg_random(unsigned previous_val)
linear congruential pseudorandom number generator
uint8_t can_pns[128]
band is allowed to PNS (informative)
int sample_rate
samples per second
static double cb(void *priv, double x, double y)
#define CB_TOT_ALL
Total number of codebooks, including special ones.
void ff_aac_update_ltp(AACEncContext *s, SingleChannelElement *sce)
Process LTP parameters.
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
uint8_t zeroes[128]
band is not coded (used by encoder)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
static av_always_inline float bval2bmax(float b)
approximates exp10f(-3.0f*(0.5f + 0.5f * cosf(FFMIN(b,15.5f) / 15.5f)))
const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB]
static int ff_sfdelta_can_remove_band(const SingleChannelElement *sce, const uint8_t *nextband, int prev_sf, int band)
static void search_for_ms(AACEncContext *s, ChannelElement *cpe)
static av_always_inline av_const float roundf(float x)
static uint8_t coef2maxsf(float coef)
Return the maximum scalefactor where the quantized coef is not zero.
#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
static double b1(void *priv, double x, double y)
#define SCALE_DIV_512
scalefactor difference that corresponds to scale difference in 512 times
static int ff_sfdelta_can_replace(const SingleChannelElement *sce, const uint8_t *nextband, int prev_sf, int new_sf, int band)
int flags
AV_CODEC_FLAG_*.
#define POW_SF2_ZERO
ff_aac_pow2sf_tab index corresponding to pow(2, 0);
IndividualChannelStream ics
static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce)
@ NOISE_BT
Spectral data are scaled white noise not coded in the bitstream.
static double b3(void *priv, double x, double y)
INTFLOAT coeffs[1024]
coefficients for IMDCT, maybe processed
void ff_aac_apply_main_pred(AACEncContext *s, SingleChannelElement *sce)
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).
static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
void ff_aac_encode_ltp_info(AACEncContext *s, SingleChannelElement *sce, int common_window)
Encode LTP data.
static void mark_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce)
static const float bands[]
#define SCALE_DIFF_ZERO
codebook index corresponding to zero scalefactor indices difference
const uint16_t * swb_offset
table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular wind...
static const uint8_t q0[256]
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).
uint8_t is_mask[128]
Set if intensity stereo is used (used by encoder)
float is_ener[128]
Intensity stereo pos (used by encoder)
static void codebook_trellis_rate(AACEncContext *s, SingleChannelElement *sce, int win, int group_len, const float lambda)
void ff_aac_apply_tns(AACEncContext *s, SingleChannelElement *sce)
int64_t bit_rate
the average bitrate
single band psychoacoustic information
void ff_aac_encode_tns_info(AACEncContext *s, SingleChannelElement *sce)
Encode TNS data.
static void ff_init_nextband_map(const SingleChannelElement *sce, uint8_t *nextband)
static const uint8_t *const run_value_bits[2]
int sf_idx[128]
scalefactor indices (used by encoder)
void ff_aac_ltp_insert_new_frame(AACEncContext *s)
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.
static const uint8_t aac_cb_out_map[CB_TOT_ALL]
Map to convert values from BandCodingPath index to a codebook index.
SingleChannelElement ch[2]
void ff_aac_adjust_common_pred(AACEncContext *s, ChannelElement *cpe)
#define NOISE_SPREAD_THRESHOLD
static const uint8_t run_bits[7][16]
static double b2(void *priv, double x, double y)
int common_window
Set if channels share a common 'IndividualChannelStream' in bitstream.
void ff_aac_adjust_common_ltp(AACEncContext *s, ChannelElement *cpe)
static void search_for_quantizers_twoloop(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
two-loop quantizers search taken from ISO 13818-7 Appendix C
uint8_t ms_mask[128]
Set if mid/side stereo is used for each scalefactor window band.
#define SCALE_MAX_DIFF
maximum scalefactor difference allowed by standard
float pns_ener[128]
Noise energy values (used by encoder)
int channels
number of audio channels
#define AAC_CUTOFF_FROM_BITRATE(bit_rate, channels, sample_rate)
static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
Single Channel Element - used for both SCE and LFE elements.
#define i(width, name, range_min, range_max)
#define SCALE_ONE_POS
scalefactor index that corresponds to scale=1.0
static int find_min_book(float maxval, int sf)
static const uint8_t aac_cb_in_map[CB_TOT_ALL+1]
Inverse map to convert from codebooks to BandCodingPath indices.
void ff_aac_search_for_tns(AACEncContext *s, SingleChannelElement *sce)
channel element - generic struct for SCE/CPE/CCE/LFE
int cutoff
Audio cutoff bandwidth (0 means "automatic")
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
static void set_special_band_scalefactors(AACEncContext *s, SingleChannelElement *sce)
#define NOISE_LOW_LIMIT
This file contains a template for the twoloop coder function.
void ff_aac_search_for_is(AACEncContext *s, AVCodecContext *avctx, ChannelElement *cpe)
structure used in optimal codebook search
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new please make sure they are as small as space on each network bandwidth and so on benefit from smaller test cases Also keep in mind older checkouts use existing sample that means in practice generally do not remove or overwrite files as it likely would break older checkouts or releases Also all needed samples for a commit should be ideally before the push If you need an account for frequently uploading samples or you wish to help others by doing that send a mail to ffmpeg devel rsync vauL Duo ug o o w
@ RESERVED_BT
Band types following are encoded differently from others.
main external API structure.
float ff_aac_pow2sf_tab[428]
static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, const float *in, float *out, int size, int scale_idx, int cb, const float lambda, int rtz)
void ff_aac_encode_main_pred(AACEncContext *s, SingleChannelElement *sce)
Encoder predictors data.
static void encode_window_bands_info(AACEncContext *s, SingleChannelElement *sce, int win, int group_len, const float lambda)
Encode band info for single window group bands.
static float find_max_val(int group_len, int swb_size, const float *scaled)
int prev_idx
pointer to the previous path point
void ff_aac_search_for_pred(AACEncContext *s, SingleChannelElement *sce)
uint8_t max_sfb
number of scalefactor bands per group
void ff_aac_search_for_ltp(AACEncContext *s, SingleChannelElement *sce, int common_window)
Mark LTP sfb's.
static float quantize_band_cost(struct AACEncContext *s, 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)
enum BandType band_type[128]
band types
void ff_quantize_band_cost_cache_init(struct AACEncContext *s)
#define NOISE_LAMBDA_REPLACE