Go to the documentation of this file.
1 /*
2  * AAC definitions and structures
3  * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
4  * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
23 /**
24  * @file
25  * AAC definitions and structures
26  * @author Oded Shimon ( ods15 ods15 dyndns org )
27  * @author Maxim Gavrilov ( maxim.gavrilov gmail com )
28  */
30 #ifndef AVCODEC_AAC_H
31 #define AVCODEC_AAC_H
34 #include "aac_defines.h"
35 #include "libavutil/float_dsp.h"
36 #include "libavutil/fixed_dsp.h"
37 #include "avcodec.h"
38 #if !USE_FIXED
39 #include "mdct15.h"
40 #endif
41 #include "fft.h"
42 #include "mpeg4audio.h"
43 #include "sbr.h"
45 #include <stdint.h>
47 #define MAX_CHANNELS 64
48 #define MAX_ELEM_ID 16
50 #define TNS_MAX_ORDER 20
51 #define MAX_LTP_LONG_SFB 40
53 #define CLIP_AVOIDANCE_FACTOR 0.95f
64 };
71  EXT_SBR_DATA = 0xd,
73 };
80 };
82 enum BandType {
83  ZERO_BT = 0, ///< Scalefactors and spectral data are all zero.
84  FIRST_PAIR_BT = 5, ///< This and later band types encode two values (rather than four) with one code word.
85  ESC_BT = 11, ///< Spectral data are coded with an escape sequence.
86  RESERVED_BT = 12, ///< Band types following are encoded differently from others.
87  NOISE_BT = 13, ///< Spectral data are scaled white noise not coded in the bitstream.
88  INTENSITY_BT2 = 14, ///< Scalefactor data are intensity stereo positions (out of phase).
89  INTENSITY_BT = 15, ///< Scalefactor data are intensity stereo positions (in phase).
90 };
92 #define IS_CODEBOOK_UNSIGNED(x) (((x) - 1) & 10)
101 };
103 /**
104  * The point during decoding at which channel coupling is applied.
105  */
110 };
112 /**
113  * Output configuration status
114  */
115 enum OCStatus {
116  OC_NONE, ///< Output unconfigured
117  OC_TRIAL_PCE, ///< Output configuration under trial specified by an inband PCE
118  OC_TRIAL_FRAME, ///< Output configuration under trial specified by a frame header
119  OC_GLOBAL_HDR, ///< Output configuration set in a global header but not yet locked
120  OC_LOCKED, ///< Output configuration locked in place
121 };
123 typedef struct OutputConfiguration {
127  int channels;
128  uint64_t channel_layout;
132 /**
133  * Predictor State
134  */
135 typedef struct PredictorState {
146 #define MAX_PREDICTORS 672
148 #define SCALE_DIV_512 36 ///< scalefactor difference that corresponds to scale difference in 512 times
149 #define SCALE_ONE_POS 140 ///< scalefactor index that corresponds to scale=1.0
150 #define SCALE_MAX_POS 255 ///< scalefactor index maximum value
151 #define SCALE_MAX_DIFF 60 ///< maximum scalefactor difference allowed by standard
152 #define SCALE_DIFF_ZERO 60 ///< codebook index corresponding to zero scalefactor indices difference
154 #define POW_SF2_ZERO 200 ///< ff_aac_pow2sf_tab index corresponding to pow(2, 0);
156 #define NOISE_PRE 256 ///< preamble for NOISE_BT, put in bitstream with the first noise band
157 #define NOISE_PRE_BITS 9 ///< length of preamble
158 #define NOISE_OFFSET 90 ///< subtracted from global gain, used as offset for the preamble
160 /**
161  * Long Term Prediction
162  */
163 typedef struct LongTermPrediction {
164  int8_t present;
165  int16_t lag;
166  int coef_idx;
168  int8_t used[MAX_LTP_LONG_SFB];
171 /**
172  * Individual Channel Stream
173  */
174 typedef struct IndividualChannelStream {
175  uint8_t max_sfb; ///< number of scalefactor bands per group
176  enum WindowSequence window_sequence[2];
177  uint8_t use_kb_window[2]; ///< If set, use Kaiser-Bessel window, otherwise use a sine window.
179  uint8_t group_len[8];
181  const uint16_t *swb_offset; ///< table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular window
182  const uint8_t *swb_sizes; ///< table of scalefactor band sizes for a particular window
183  int num_swb; ///< number of scalefactor window bands
189  int predictor_reset_count[31]; ///< used by encoder to count prediction resets
190  uint8_t prediction_used[41];
191  uint8_t window_clipping[8]; ///< set if a certain window is near clipping
192  float clip_avoidance_factor; ///< set if any window is near clipping to the necessary atennuation factor to avoid it
195 /**
196  * Temporal Noise Shaping
197  */
198 typedef struct TemporalNoiseShaping {
199  int present;
200  int n_filt[8];
201  int length[8][4];
202  int direction[8][4];
203  int order[8][4];
204  int coef_idx[8][4][TNS_MAX_ORDER];
205  INTFLOAT coef[8][4][TNS_MAX_ORDER];
208 /**
209  * Dynamic Range Control - decoded from the bitstream but not processed further.
210  */
211 typedef struct DynamicRangeControl {
212  int pce_instance_tag; ///< Indicates with which program the DRC info is associated.
213  int dyn_rng_sgn[17]; ///< DRC sign information; 0 - positive, 1 - negative
214  int dyn_rng_ctl[17]; ///< DRC magnitude information
215  int exclude_mask[MAX_CHANNELS]; ///< Channels to be excluded from DRC processing.
216  int band_incr; ///< Number of DRC bands greater than 1 having DRC info.
217  int interpolation_scheme; ///< Indicates the interpolation scheme used in the SBR QMF domain.
218  int band_top[17]; ///< Indicates the top of the i-th DRC band in units of 4 spectral lines.
219  int prog_ref_level; /**< A reference level for the long-term program audio level for all
220  * channels combined.
221  */
224 typedef struct Pulse {
226  int start;
227  int pos[4];
228  int amp[4];
229 } Pulse;
231 /**
232  * coupling parameters
233  */
234 typedef struct ChannelCoupling {
235  enum CouplingPoint coupling_point; ///< The point during decoding at which coupling is applied.
236  int num_coupled; ///< number of target elements
237  enum RawDataBlockType type[8]; ///< Type of channel element to be coupled - SCE or CPE.
238  int id_select[8]; ///< element id
239  int ch_select[8]; /**< [0] shared list of gains; [1] list of gains for right channel;
240  * [2] list of gains for left channel; [3] lists of gains for both channels
241  */
242  INTFLOAT gain[16][120];
245 /**
246  * Single Channel Element - used for both SCE and LFE elements.
247  */
248 typedef struct SingleChannelElement {
252  enum BandType band_type[128]; ///< band types
253  enum BandType band_alt[128]; ///< alternative band type (used by encoder)
254  int band_type_run_end[120]; ///< band type run end points
255  INTFLOAT sf[120]; ///< scalefactors
256  int sf_idx[128]; ///< scalefactor indices (used by encoder)
257  uint8_t zeroes[128]; ///< band is not coded (used by encoder)
258  uint8_t can_pns[128]; ///< band is allowed to PNS (informative)
259  float is_ener[128]; ///< Intensity stereo pos (used by encoder)
260  float pns_ener[128]; ///< Noise energy values (used by encoder)
261  DECLARE_ALIGNED(32, INTFLOAT, pcoeffs)[1024]; ///< coefficients for IMDCT, pristine
262  DECLARE_ALIGNED(32, INTFLOAT, coeffs)[1024]; ///< coefficients for IMDCT, maybe processed
263  DECLARE_ALIGNED(32, INTFLOAT, saved)[1536]; ///< overlap
264  DECLARE_ALIGNED(32, INTFLOAT, ret_buf)[2048]; ///< PCM output buffer
265  DECLARE_ALIGNED(16, INTFLOAT, ltp_state)[3072]; ///< time signal for LTP
266  DECLARE_ALIGNED(32, AAC_FLOAT, lcoeffs)[1024]; ///< MDCT of LTP coefficients (used by encoder)
267  DECLARE_ALIGNED(32, AAC_FLOAT, prcoeffs)[1024]; ///< Main prediction coefs (used by encoder)
268  PredictorState predictor_state[MAX_PREDICTORS];
269  INTFLOAT *ret; ///< PCM output
272 /**
273  * channel element - generic struct for SCE/CPE/CCE/LFE
274  */
275 typedef struct ChannelElement {
276  int present;
277  // CPE specific
278  int common_window; ///< Set if channels share a common 'IndividualChannelStream' in bitstream.
279  int ms_mode; ///< Signals mid/side stereo flags coding mode (used by encoder)
280  uint8_t is_mode; ///< Set if any bands have been encoded using intensity stereo (used by encoder)
281  uint8_t ms_mask[128]; ///< Set if mid/side stereo is used for each scalefactor window band
282  uint8_t is_mask[128]; ///< Set if intensity stereo is used (used by encoder)
283  // shared
285  // CCE specific
290 /**
291  * main AAC context
292  */
293 struct AACContext {
294  AVClass *class;
298  int is_saved; ///< Set if elements have stored overlap from previous frame.
301  /**
302  * @name Channel element related data
303  * @{
304  */
306  ChannelElement *tag_che_map[4][MAX_ELEM_ID];
309  /** @} */
311  /**
312  * @name temporary aligned temporary buffers
313  * (We do not want to have these on the stack.)
314  * @{
315  */
316  DECLARE_ALIGNED(32, INTFLOAT, buf_mdct)[1024];
317  /** @} */
319  /**
320  * @name Computed / set up during initialization
321  * @{
322  */
327 #if USE_FIXED
328  AVFixedDSPContext *fdsp;
329 #else
334 #endif /* USE_FIXED */
336  /** @} */
338  /**
339  * @name Members used for output
340  * @{
341  */
342  SingleChannelElement *output_element[MAX_CHANNELS]; ///< Points to each SingleChannelElement
343  /** @} */
346  /**
347  * @name Japanese DTV specific extension
348  * @{
349  */
350  int force_dmono_mode;///< 0->not dmono, 1->use first channel, 2->use second channel
351  int dmono_mode; ///< 0->not dmono, 1->use first channel, 2->use second channel
352  /** @} */
359  unsigned warned_71_wide;
362  /* aacdec functions pointers */
366  IndividualChannelStream *ics, int decode);
370  void (*vector_pow43)(int *coefs, int len);
371  void (*subband_scale)(int *dst, int *src, int scale, int offset, int len, void *log_context);
373 };
377 #endif /* AVCODEC_AAC_H */
int predictor_initialized
Definition: aac.h:187
AVFloatDSPContext * fdsp
Definition: aac.h:333
static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
Conduct IMDCT and windowing.
static void apply_ltp(AACContext *ac, SingleChannelElement *sce)
Apply the long term prediction.
Band types following are encoded differently from others.
Definition: aac.h:86
Definition: aac.h:60
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
AVCodecContext * avctx
Definition: aac.h:295
Definition: aac.h:224
else temp
Definition: vf_mcdeint.c:256
Definition: aac.h:63
Definition: aac.h:56
Definition: aac.h:57
PCM output.
Definition: aac.h:269
int present
Definition: aac.h:276
int common_window
Set if channels share a common &#39;IndividualChannelStream&#39; in bitstream.
Definition: aac.h:278
static void update_ltp(AACContext *ac, SingleChannelElement *sce)
Update the LTP buffer for next frame.
static void vector_pow43(int *coefs, int len)
Definition: aacdec_fixed.c:151
uint64_t channel_layout
Definition: aac.h:128
GLint GLenum type
Definition: opengl_enc.c:104
Definition: aac.h:51
Dynamic Range Control - decoded from the bitstream but not processed further.
Definition: aac.h:211
Definition: aac.h:94
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
Spectral data are scaled white noise not coded in the bitstream.
Definition: aac.h:87
Definition: aac.h:58
int band_incr
Number of DRC bands greater than 1 having DRC info.
Definition: aac.h:216
int dmono_mode
0->not dmono, 1->use first channel, 2->use second channel
Definition: aac.h:351
const uint16_t * swb_offset
table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular wind...
Definition: aac.h:181
Definition: aac_defines.h:86
Definition: aac.h:67
Definition: aac.h:136
Definition: aac.h:82
uint8_t layout_map[MAX_ELEM_ID *4][3]
Definition: aac.h:125
Definition: aac.h:139
Output configuration under trial specified by an inband PCE.
Definition: aac.h:117
int warned_960_sbr
Definition: aac.h:358
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
Definition: aac.h:59
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
Definition: undefined.txt:32
TemporalNoiseShaping tns
Definition: aac.h:250
The point during decoding at which channel coupling is applied.
Definition: aac.h:106
int num_coupled
number of target elements
Definition: aac.h:236
FFTContext mdct_ltp
Definition: aac.h:326
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:112
Definition: aac.h:137
Scalefactor data are intensity stereo positions (in phase).
Definition: aac.h:89
Output configuration set in a global header but not yet locked.
Definition: aac.h:119
int random_state
Definition: aac.h:335
MDCT15Context * mdct480
Definition: aac.h:331
#define src
Definition: vp8dsp.c:254
MPEG4AudioConfig m4ac
Definition: aac.h:124
Definition: aac.h:141
SpectralBandReplication sbr
Definition: aac.h:287
FFTContext mdct_small
Definition: aac.h:324
unsigned int pos
Definition: spdifenc.c:410
Definition: aac.h:66
Definition: aac.h:140
Spectral Band Replication definitions and structures.
GLsizei GLsizei * length
Definition: opengl_enc.c:114
uint8_t max_sfb
number of scalefactor bands per group
Definition: aac.h:175
Definition: aac.h:62
Definition: aac.h:75
int num_swb
number of scalefactor window bands
Definition: aac.h:183
int prog_ref_level
A reference level for the long-term program audio level for all channels combined.
Definition: aac.h:219
Output configuration locked in place.
Definition: aac.h:120
Predictor State.
Definition: aac.h:135
int warned_remapping_once
Definition: aac.h:308
Definition: aac.h:143
Definition: fft.h:88
int predictor_reset_group
Definition: aac.h:188
MDCT15Context * mdct120
Definition: aac.h:330
Definition: aac_defines.h:90
FFTContext mdct_ld
Definition: aac.h:325
void ff_aacdec_init_mips(AACContext *c)
Definition: aacdec_mips.c:433
int pce_instance_tag
Indicates with which program the DRC info is associated.
Definition: aac.h:212
static void windowing_and_mdct_ltp(AACContext *ac, INTFLOAT *out, INTFLOAT *in, IndividualChannelStream *ics)
Apply windowing and MDCT to obtain the spectral coefficient from the predicted sample by LTP...
int interpolation_scheme
Indicates the interpolation scheme used in the SBR QMF domain.
Definition: aac.h:217
coupling parameters
Definition: aac.h:234
int tags_mapped
Definition: aac.h:307
MDCT15Context * mdct960
Definition: aac.h:332
int force_dmono_mode
0->not dmono, 1->use first channel, 2->use second channel
Definition: aac.h:350
int is_saved
Set if elements have stored overlap from previous frame.
Definition: aac.h:298
int warned_num_aac_frames
Definition: aac.h:357
Libavcodec external API header.
Temporal Noise Shaping.
Definition: aac.h:198
Long Term Prediction.
Definition: aac.h:163
static void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns, IndividualChannelStream *ics, int decode)
Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4...
main external API structure.
Definition: avcodec.h:1621
IndividualChannelStream ics
Definition: aac.h:249
Definition: aac.h:146
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
#define MAX_ELEM_ID
Definition: aac.h:48
Describe the class of an AVClass context structure.
Definition: log.h:67
unsigned warned_71_wide
Definition: aac.h:359
Spectral data are coded with an escape sequence.
Definition: aac.h:85
const uint8_t * swb_sizes
table of scalefactor band sizes for a particular window
Definition: aac.h:182
Output configuration status.
Definition: aac.h:115
Definition: aac.h:47
Definition: aac.h:50
main AAC context
Definition: aac.h:293
LongTermPrediction ltp
Definition: aac.h:180
Definition: aac.h:142
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi-0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64,*(const int64_t *) pi *(1.0f/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64,*(const int64_t *) pi *(1.0/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(UINT64_C(1)<< 63)))#define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64),};static void cpy1(uint8_t **dst, const uint8_t **src, int len){memcpy(*dst,*src, len);}static void cpy2(uint8_t **dst, const uint8_t **src, int len){memcpy(*dst,*src, 2 *len);}static void cpy4(uint8_t **dst, const uint8_t **src, int len){memcpy(*dst,*src, 4 *len);}static void cpy8(uint8_t **dst, const uint8_t **src, int len){memcpy(*dst,*src, 8 *len);}AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags){AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);}ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map){switch(av_get_bytes_per_sample(in_fmt)){case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;}}if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;}void swri_audio_convert_free(AudioConvert **ctx){av_freep(ctx);}int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len){int ch;int off=0;const int os=(out->planar?1:out->ch_count)*out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask){int planes=in->planar?in->ch_count:1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;}if(ctx->out_simd_align_mask){int planes=out->planar?out->ch_count:1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;}if(ctx->simd_f &&!ctx->ch_map &&!misaligned){off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){if(out->planar==in->planar){int planes=out->planar?out->ch_count:1;for(ch=0;ch< planes;ch++){ctx->simd_f(out-> ch ch
Definition: audioconvert.c:56
ChannelCoupling coup
Definition: aac.h:286
int ms_mode
Signals mid/side stereo flags coding mode (used by encoder)
Definition: aac.h:279
Output configuration under trial specified by a frame header.
Definition: aac.h:118
uint8_t is_mode
Set if any bands have been encoded using intensity stereo (used by encoder)
Definition: aac.h:280
enum OCStatus status
Definition: aac.h:129
Scalefactor data are intensity stereo positions (out of phase).
Definition: aac.h:88
int16_t lag
Definition: aac.h:165
DynamicRangeControl che_drc
Definition: aac.h:299
AVFrame * frame
Definition: aac.h:296
Single Channel Element - used for both SCE and LFE elements.
Definition: aac.h:248
Definition: aac.h:61
Individual Channel Stream.
Definition: aac.h:174
float clip_avoidance_factor
set if any window is near clipping to the necessary atennuation factor to avoid it ...
Definition: aac.h:192
Definition: aac.h:167
channel element - generic struct for SCE/CPE/CCE/LFE
Definition: aac.h:275
int start
Definition: aac.h:226
static void subband_scale(int *dst, int *src, int scale, int offset, int len, void *log_context)
Definition: aacdec_fixed.c:165
int warned_gain_control
Definition: aac.h:360
int len
Scalefactors and spectral data are all zero.
Definition: aac.h:83
int num_pulse
Definition: aac.h:225
FILE * out
Definition: movenc.c:54
FFTContext mdct
Definition: aac.h:323
int8_t present
Definition: aac.h:164
Spectral Band Replication.
Definition: sbr.h:139
int layout_map_tags
Definition: aac.h:126
Definition: aac.h:138
Output unconfigured.
Definition: aac.h:116
This and later band types encode two values (rather than four) with one code word.
Definition: aac.h:84
Definition: aac.h:55