62 #define FFT_FIXED_32 1 102 ps->
var0.mant = 0x20000000;
104 ps->
var1.mant = 0x20000000;
108 static const int exp2tab[4] = {
Q31(1.0000000000/2),
Q31(1.1892071150/2),
Q31(1.4142135624/2),
Q31(1.6817928305/2) };
112 dst[0] = (idx & 15) - 4;
113 dst[1] = (idx >> 4 & 15) - 4;
120 dst[0] = (idx & 3) - 1;
121 dst[1] = (idx >> 2 & 3) - 1;
122 dst[2] = (idx >> 4 & 3) - 1;
123 dst[3] = (idx >> 6 & 3) - 1;
128 static inline int *
DEC_UPAIR(
int *dst,
unsigned idx,
unsigned sign)
130 dst[0] = (idx & 15) * (1 - (sign & 0xFFFFFFFE));
131 dst[1] = (idx >> 4 & 15) * (1 - ((sign & 1) * 2));
136 static inline int *
DEC_UQUAD(
int *dst,
unsigned idx,
unsigned sign)
138 unsigned nz = idx >> 12;
140 dst[0] = (idx & 3) * (1 + (((
int)sign >> 31) * 2));
143 dst[1] = (idx >> 2 & 3) * (1 + (((
int)sign >> 31) * 2));
146 dst[2] = (idx >> 4 & 3) * (1 + (((
int)sign >> 31) * 2));
149 dst[3] = (idx >> 6 & 3) * (1 + (((
int)sign >> 31) * 2));
158 for (i=0; i<
len; i++) {
170 int ssign = scale < 0 ? -1 : 1;
173 int i,
out,
c = exp2tab[s & 3];
175 s = offset - (s >> 2);
178 for (i=0; i<
len; i++) {
183 for (i=0; i<
len; i++) {
184 out = (
int)(((int64_t)src[
i] *
c) >> 32);
185 dst[
i] = ((
int)(out+round) >>
s) * ssign;
187 }
else if (s > -32) {
190 for (i=0; i<
len; i++) {
191 out = (
int)((int64_t)((int64_t)src[i] * c + round) >>
s);
192 dst[
i] = out * (unsigned)ssign;
203 int i,
out,
c = exp2tab[s & 3];
207 while (band_energy > 0x7fff) {
212 s = 21 + nlz - (s >> 2);
215 for (i=0; i<
len; i++) {
219 round = s ? 1 << (s-1) : 0;
220 for (i=0; i<
len; i++) {
221 out = (
int)(((int64_t)coefs[
i] *
c) >> 32);
222 coefs[
i] = -((
int)(out+round) >>
s);
229 for (i=0; i<
len; i++) {
230 out = (
int)((int64_t)((int64_t)coefs[i] * c + round) >>
s);
234 for (i=0; i<
len; i++)
235 coefs[i] = -(int64_t)coefs[
i] * c * (1 << -
s);
248 tmp.
mant = (tmp.
mant + 0x00200000
U) & 0xFFC00000U;
262 tmp.
mant = (tmp.
mant + 0x001FFFFF
U + (tmp.
mant & 0x00400000
U >> 16)) & 0xFFC00000
U;
295 if (var0.
exp > 1 || (var0.
exp == 1 && var0.
mant > 0x20000000)) {
303 if (var1.exp > 1 || (var1.exp == 1 && var1.mant > 0x20000000)) {
318 *coef += (unsigned)((pv.
mant + (1 << (shift - 1))) >>
shift);
320 *coef += (unsigned)pv.
mant << -shift;
363 int *dest = target->
coeffs;
365 int g,
i, group, k, idx = 0;
368 "Dependent coupling is not supported together with LTP\n");
372 for (i = 0; i < ics->
max_sfb; i++, idx++) {
378 c = -cce_scale_fixed[-gain & 7];
379 shift = (-gain-1024) >> 3;
382 c = cce_scale_fixed[gain & 7];
383 shift = (gain-1024) >> 3;
388 }
else if (shift < 0) {
390 round = 1 << (shift - 1);
392 for (group = 0; group < ics->
group_len[
g]; group++) {
393 for (k = offsets[i]; k < offsets[i + 1]; k++) {
394 tmp = (
int)(((int64_t)src[group * 128 + k] * c + \
395 (int64_t)0x1000000000) >> 37);
396 dest[group * 128 + k] += (tmp + (int64_t)round) >>
shift;
401 for (group = 0; group < ics->
group_len[
g]; group++) {
402 for (k = offsets[i]; k < offsets[i + 1]; k++) {
403 tmp = (
int)(((int64_t)src[group * 128 + k] * c + \
404 (int64_t)0x1000000000) >> 37);
405 dest[group * 128 + k] += tmp * (1
U <<
shift);
428 unsigned int *dest = target->
ret;
431 c = cce_scale_fixed[gain & 7];
432 shift = (gain-1024) >> 3;
435 }
else if (shift < 0) {
437 round = 1 << (shift - 1);
439 for (i = 0; i <
len; i++) {
440 tmp = (
int)(((int64_t)src[
i] * c + (int64_t)0x1000000000) >> 37);
441 dest[
i] += (tmp +
round) >> shift;
445 for (i = 0; i <
len; i++) {
446 tmp = (
int)(((int64_t)src[
i] * c + (int64_t)0x1000000000) >> 37);
447 dest[
i] += tmp * (1
U <<
shift);
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
static int shift(int a, int b)
static void flush(AVCodecContext *avctx)
static av_always_inline SoftFloat flt16_round(SoftFloat pf)
static int * DEC_UPAIR(int *dst, unsigned idx, unsigned sign)
static void apply_dependent_coupling_fixed(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index)
Apply dependent channel coupling (applied before IMDCT).
static av_cold int init(AVCodecContext *avctx)
static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b)
b has to be normalized and not zero.
static int * DEC_SQUAD(int *dst, unsigned idx)
const AVProfile ff_aac_profiles[]
INTFLOAT * ret
PCM output.
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static void vector_pow43(int *coefs, int len)
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
const uint16_t * swb_offset
table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular wind...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
static const int offsets[]
SingleChannelElement ch[2]
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
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
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
static av_cold int aac_decode_init(AVCodecContext *avctx)
uint32_t ff_cbrt_tab_fixed[1<< 13]
static void apply_independent_coupling_fixed(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index)
Apply independent channel coupling (applied after IMDCT).
bitstream reader API header.
static av_always_inline void predict(PredictorState *ps, int *coef, int output_enable)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectral Band Replication definitions and structures.
const char * name
Name of the codec implementation.
static av_always_inline av_const double round(double x)
uint8_t max_sfb
number of scalefactor bands per group
static av_always_inline void reset_predict_state(PredictorState *ps)
static const uint64_t aac_channel_layout[16]
AAC Spectral Band Replication function declarations.
static int aac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
AAC definitions and structures.
static const int cce_scale_fixed[8]
Libavcodec external API header.
AVSampleFormat
Audio sample formats.
static const int16_t alpha[]
IndividualChannelStream ics
static av_cold int aac_decode_close(AVCodecContext *avctx)
static void noise_scale(int *coefs, int scale, int band_energy, int len)
static av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b)
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
INTFLOAT coeffs[1024]
coefficients for IMDCT, maybe processed
OutputConfiguration oc[2]
common internal api header.
Single Channel Element - used for both SCE and LFE elements.
static av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b)
Individual Channel Stream.
channel element - generic struct for SCE/CPE/CCE/LFE
static const int exp2tab[4]
static void subband_scale(int *dst, int *src, int scale, int offset, int len, void *log_context)
Scalefactors and spectral data are all zero.
static int * DEC_SPAIR(int *dst, unsigned idx)
static av_always_inline SoftFloat flt16_trunc(SoftFloat pf)
enum BandType band_type[128]
band types
static enum AVSampleFormat sample_fmts[]
AVCodec ff_aac_fixed_decoder
int sbr
-1 implicit, 1 presence
static av_const SoftFloat av_int2sf(int v, int frac_bits)
Converts a mantisse and exponent to a SoftFloat.
static av_always_inline SoftFloat flt16_even(SoftFloat pf)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static int * DEC_UQUAD(int *dst, unsigned idx, unsigned sign)