Go to the documentation of this file.
34 #define SFB_PER_PRED_BAND 2
39 if (
val < ((1 << nb1) - 1))
43 if (nb3 && (val2 == ((1 << nb2) - 1)))
101 for (
int i = 0;
i <
info->nb_measurements;
i++) {
134 uint8_t size_bits =
get_bits(gb, 4) + 4;
135 uint8_t bit_size =
get_bits(gb, size_bits) + 1;
141 for (
int i = 0;
i < bit_size;
i++)
153 uint8_t header_extra1;
154 uint8_t header_extra2;
182 e->
sbr.
dflt.smoothing_mode = 1;
239 int len = 0, ext_config_len;
277 int elem_id[3 ] = { 0, 0, 0 };
310 memset(
us, 0,
sizeof(*
us));
315 for (
int j = 0; j < ch; j++) {
319 memset(
ue, 0,
sizeof(*
ue));
322 ue->noise.seed = 0x3039;
339 uint8_t channel_config_idx;
341 int ratio_mult, ratio_dec;
354 memset(usac, 0,
sizeof(*usac));
357 if (freq_idx == 0x1f) {
377 if (sbr_ratio == 2) {
380 }
else if (sbr_ratio == 3) {
383 }
else if (sbr_ratio == 4) {
393 m4ac->
sample_rate = (samplerate * ratio_dec) / ratio_mult;
396 m4ac->
sbr = sbr_ratio > 0;
398 channel_config_idx =
get_bits(gb, 5);
399 if (!channel_config_idx) {
402 if (nb_channels > 64)
411 for (
int i = 0;
i < nb_channels;
i++) {
428 &nb_elements, channel_config_idx)))
432 for (
int i = 0;
i < nb_elements;
i++)
433 nb_channels += layout_map[
i][0] ==
TYPE_CPE ? 2 : 1;
439 elem_id[0] = elem_id[1] = elem_id[2] = 0;
449 int map_count = elem_id[0] + elem_id[1] + elem_id[2];
451 memset(e, 0,
sizeof(*e));
473 layout_map[map_count][0] =
TYPE_SCE;
474 layout_map[map_count][1] = elem_id[0]++;
485 layout_map[map_count][0] =
TYPE_CPE;
486 layout_map[map_count][1] = elem_id[1]++;
495 layout_map[map_count][0] =
TYPE_LFE;
496 layout_map[map_count][1] = elem_id[2]++;
520 for (
int i = 0;
i < nb_extensions;
i++) {
566 int offset_sf = global_gain;
568 for (
int sfb = 0; sfb < ics->
max_sfb; sfb++) {
573 sce->
sfo[0] = offset_sf - 100;
578 if (offset_sf > 255
U) {
580 "Scalefactor (%d) out of range.\n", offset_sf);
601 int reset, uint16_t
len, uint16_t
N)
623 for (
i = 0;
i <
len/2;
i++) {
627 for (lvl=esc_nb=0;;) {
639 if ((esc_nb = lvl) > 7)
654 for (
int l = lvl; l > 0; l--) {
655 int lsbidx = !
a ? 1 : (!
b ? 0 : 2);
658 a = (
a << 1) | (
r & 1);
659 b = (
b << 1) | ((
r >> 1) & 1);
671 skip_bits(gb, gb_count2 - gb_count - 14);
678 for (;
i <
N/2;
i++) {
684 for (
i = 0;
i <
len;
i++) {
696 int num_window_groups,
697 int prev_num_window_groups,
704 for (
int g = 0;
g < num_window_groups;
g++) {
713 for (
int g = 0;
g < num_window_groups;
g++)
721 us->use_prev_frame = 0;
722 if (
us->complex_coef && !indep_flag)
730 for (
int g = 0;
g < num_window_groups;
g++) {
732 float last_alpha_q_re = 0;
733 float last_alpha_q_im = 0;
734 if (delta_code_time) {
745 const int wg = prev_num_window_groups - 1;
746 last_alpha_q_re =
us->prev_alpha_q_re[wg*cpe->
max_sfb_ste + sfb];
747 last_alpha_q_im =
us->prev_alpha_q_im[wg*cpe->
max_sfb_ste + sfb];
761 last_alpha_q_re +=
val * 0.1f;
762 if (
us->complex_coef) {
764 last_alpha_q_im +=
val * 0.1f;
806 for (
int j = 0; j < 7; j++) {
808 if (
ue->scale_factor_grouping & (1 << (6 - j)))
834 "Number of scalefactor bands in group (%d) "
835 "exceeds limit (%d).\n",
862 us->common_window = 0;
867 memset(
us->alpha_q_re, 0,
sizeof(
us->alpha_q_re));
868 memset(
us->alpha_q_im, 0,
sizeof(
us->alpha_q_im));
876 if (!
us->common_window || indep_flag) {
877 memset(
us->prev_alpha_q_re, 0,
sizeof(
us->prev_alpha_q_re));
878 memset(
us->prev_alpha_q_im, 0,
sizeof(
us->prev_alpha_q_im));
881 if (
us->common_window) {
901 memset(
us->prev_alpha_q_re, 0,
sizeof(
us->prev_alpha_q_re));
902 memset(
us->prev_alpha_q_im, 0,
sizeof(
us->prev_alpha_q_im));
931 if (
us->ms_mask_mode == 1) {
935 }
else if (
us->ms_mask_mode == 2) {
950 "AAC USAC timewarping");
958 if (
us->common_window)
966 memcpy(&sce2->
tns, &sce1->
tns,
sizeof(sce1->
tns));
990 unsigned int new_seed = *
seed = ((*seed) * 69069) + 5;
991 if (((new_seed) & 0x10000) > 0)
1002 float noise_val =
powf(2, ((
float)
ue->noise.level - 14.0f)/3.0f);
1003 int noise_offset =
ue->noise.offset - 16;
1013 for (
int sfb = 0; sfb < ics->
max_sfb; sfb++) {
1016 int band_quantized_to_zero = 1;
1021 for (
int group = 0; group < (unsigned)g_len; group++,
cb += 128) {
1022 for (
int z = 0; z < cb_len; z++) {
1026 band_quantized_to_zero = 0;
1030 if (band_quantized_to_zero)
1044 if (
ue->noise.level)
1055 for (
int sfb = 0; sfb < ics->
max_sfb; sfb++) {
1058 float sf = sce->sf[
g*ics->
max_sfb + sfb];
1060 for (
int group = 0; group < (unsigned)g_len; group++,
cb += 128)
1077 for (
int sfb = 0; sfb < cpe->
max_sfb_ste; sfb++) {
1081 float *
c1 = coef1 + off;
1082 float *
c2 = coef2 + off;
1083 float *dm = dmix_re + off;
1085 for (
int group = 0; group < (unsigned)g_len;
1086 group++,
c1 += 128,
c2 += 128, dm += 128) {
1087 for (
int z = 0; z < cb_len; z++)
1088 dm[z] = 0.5*(
c1[z] + sign*
c2[z]);
1092 coef1 += g_len << 7;
1093 coef2 += g_len << 7;
1094 dmix_re += g_len << 7;
1109 for (
int sfb = 0; sfb < cpe->
max_sfb_ste; sfb++) {
1113 float *
c1 = coef1 + off;
1114 float *
c2 = coef2 + off;
1115 float *dm = dmix_re + off;
1118 for (
int group = 0; group < (unsigned)g_len;
1119 group++,
c1 += 128,
c2 += 128, dm += 128) {
1120 for (
int z = 0; z < cb_len; z++)
1121 dm[z] = 0.5*(
c1[z] + sign*
c2[z]);
1124 for (
int group = 0; group < (unsigned)g_len;
1125 group++,
c1 += 128,
c2 += 128, dm += 128) {
1126 for (
int z = 0; z < cb_len; z++)
1132 coef1 += g_len << 7;
1133 coef2 += g_len << 7;
1134 dmix_re += g_len << 7;
1139 int len,
int factor_even,
int factor_odd)
1144 s =
f[6]*re[2] +
f[5]*re[1] +
f[4]*re[0] +
1146 f[2]*re[1] +
f[1]*re[2] +
f[0]*re[3];
1147 im[
i] +=
s*factor_even;
1150 s =
f[6]*re[1] +
f[5]*re[0] +
f[4]*re[0] +
1152 f[2]*re[2] +
f[1]*re[3] +
f[0]*re[4];
1153 im[
i] +=
s*factor_odd;
1156 s =
f[6]*re[0] +
f[5]*re[0] +
f[4]*re[1] +
1158 f[2]*re[3] +
f[1]*re[4] +
f[0]*re[5];
1160 im[
i] +=
s*factor_even;
1161 for (
i = 3;
i <
len - 4;
i += 2) {
1162 s =
f[6]*re[
i-3] +
f[5]*re[
i-2] +
f[4]*re[
i-1] +
1164 f[2]*re[
i+1] +
f[1]*re[
i+2] +
f[0]*re[
i+3];
1165 im[
i+0] +=
s*factor_odd;
1167 s =
f[6]*re[
i-2] +
f[5]*re[
i-1] +
f[4]*re[
i] +
1169 f[2]*re[
i+2] +
f[1]*re[
i+3] +
f[0]*re[
i+4];
1170 im[
i+1] +=
s*factor_even;
1174 s =
f[6]*re[
i-3] +
f[5]*re[
i-2] +
f[4]*re[
i-1] +
1176 f[2]*re[
i+1] +
f[1]*re[
i+2] +
f[0]*re[
i+2];
1177 im[
i] +=
s*factor_odd;
1180 s =
f[6]*re[
i-3] +
f[5]*re[
i-2] +
f[4]*re[
i-1] +
1182 f[2]*re[
i+1] +
f[1]*re[
i+1] +
f[0]*re[
i];
1183 im[
i] +=
s*factor_even;
1186 s =
f[6]*re[
i-3] +
f[5]*re[
i-2] +
f[4]*re[
i-1] +
1188 f[2]*re[
i] +
f[1]*re[
i-1] +
f[0]*re[
i-2];
1189 im[
i] +=
s*factor_odd;
1198 float *dmix_im =
us->dmix_im;
1202 for (
int sfb = 0; sfb < cpe->
max_sfb_ste; sfb++) {
1206 float *
c1 = coef1 + off;
1207 float *
c2 = coef2 + off;
1208 float *dm_im = dmix_im + off;
1216 for (
int group = 0; group < (unsigned)g_len;
1217 group++,
c1 += 128,
c2 += 128, dm_im += 128) {
1218 for (
int z = 0; z < cb_len; z++) {
1220 side =
c2[z] - alpha_re*
c1[z] - alpha_im*dm_im[z];
1221 c2[z] =
c1[z] - side;
1222 c1[z] =
c1[z] + side;
1226 for (
int group = 0; group < (unsigned)g_len;
1227 group++,
c1 += 128,
c2 += 128, dm_im += 128) {
1228 for (
int z = 0; z < cb_len; z++) {
1230 mid =
c2[z] - alpha_re*
c1[z] - alpha_im*dm_im[z];
1231 c2[z] = mid -
c1[z];
1232 c1[z] = mid +
c1[z];
1238 coef1 += g_len << 7;
1239 coef2 += g_len << 7;
1240 dmix_im += g_len << 7;
1289 for (
int ch = 0; ch < nb_channels; ch++) {
1296 if (nb_channels > 1 &&
us->common_window) {
1297 for (
int ch = 0; ch < nb_channels; ch++) {
1305 if (
us->ms_mask_mode == 3) {
1313 if (
us->use_prev_frame) {
1320 }
else if (
us->ms_mask_mode > 0) {
1326 if (nb_channels > 1) {
1328 for (
int ch = 0; ch < nb_channels; ch++) {
1330 memcpy(sce->prev_coeffs, sce->
coeffs,
sizeof(sce->
coeffs));
1332 memcpy(
us->prev_alpha_q_re,
us->alpha_q_re,
sizeof(
us->alpha_q_re));
1333 memcpy(
us->prev_alpha_q_im,
us->alpha_q_im,
sizeof(
us->alpha_q_im));
1336 for (
int ch = 0; ch < nb_channels; ch++) {
1340 if (sce->
tns.
present && ((nb_channels == 1) || (
us->tns_on_lr)))
1353 int arith_reset_flag;
1355 int core_nb_channels = nb_channels;
1358 uint8_t global_gain;
1360 us->common_window = 0;
1362 for (
int ch = 0; ch < core_nb_channels; ch++) {
1367 ue->tns_data_present = 0;
1373 core_nb_channels = 1;
1375 if (core_nb_channels == 2) {
1381 for (
int ch = 0; ch < core_nb_channels; ch++) {
1386 if (
ue->core_mode) {
1393 if ((core_nb_channels == 1) ||
1400 ue->noise.level = 0;
1406 if (!
us->common_window) {
1429 "AAC USAC timewarping");
1438 if (
ue->tns_data_present) {
1446 arith_reset_flag = indep_flag;
1447 if (!arith_reset_flag)
1451 memset(&sce->
coeffs[0], 0, 1024*
sizeof(
float));
1461 arith_reset_flag && (
win == 0), lg,
N);
1477 int sbr_ch = nb_channels;
1478 if (nb_channels == 2 &&
1510 uint8_t temp_data[512];
1511 uint8_t *tmp_buf = temp_data;
1512 size_t tmp_buf_size =
sizeof(temp_data);
1515 int num_preroll_frames;
1533 if (!memcmp(m4ac, &m4ac_bak,
sizeof(m4ac_bak)))
1542 for (
int i = 0;
i < num_preroll_frames;
i++) {
1543 int got_frame_ptr = 0;
1546 if (au_len*8 > tmp_buf_size) {
1548 tmp_buf = tmp_buf == temp_data ?
NULL : tmp_buf;
1551 if (tmp_buf != temp_data)
1559 for (
int i = 0;
i < au_len;
i++)
1571 if (tmp_buf != temp_data)
1581 uint8_t pl_frag_start = 1;
1582 uint8_t pl_frag_end = 1;
1608 if (!(pl_frag_start && pl_frag_end)) {
1617 for (
int i = 0;
i <
len;
i++)
1629 if (!(pl_frag_start && pl_frag_end)) {
1661 int ret, is_dmono = 0;
1663 int audio_found = 0;
1664 int elem_id[3 ] = { 0, 0, 0 };
1667 int ratio_mult, ratio_dec;
1674 if (sbr_ratio == 2) {
1677 }
else if (sbr_ratio == 3) {
1680 }
else if (sbr_ratio == 4) {
1702 layout_id = elem_id[0]++;
1706 layout_id = elem_id[1]++;
1710 layout_id = elem_id[2]++;
1717 "channel element %d.%d is not allocated\n",
1718 layout_type, layout_id);
1756 if (ac->
oc[1].
status && audio_found) {
1779 is_dmono = ac->
dmono_mode && elem_id[0] == 2 &&
uint8_t stereo_config_index
int frame_size
Number of samples per channel in an audio frame.
const uint8_t ff_usac_noise_fill_start_offset[2][2]
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
struct AACUsacElemConfig::@22 sbr
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static int decode_usac_stereo_info(AACDecContext *ac, AACUSACConfig *usac, AACUsacElemConfig *ec, ChannelElement *cpe, GetBitContext *gb, int indep_flag)
#define AV_CHANNEL_LAYOUT_STEREO
int sample_rate
samples per second
uint16_t stream_identifier
static double cb(void *priv, double x, double y)
static void spectrum_decode(AACDecContext *ac, AACUSACConfig *usac, ChannelElement *cpe, int nb_channels)
int ff_aac_usac_config_decode(AACDecContext *ac, AVCodecContext *avctx, GetBitContext *gb, OutputConfiguration *oc, int channel_config)
const uint16_t ff_aac_ac_lsb_cdfs[3][4]
static int get_bits_count(const GetBitContext *s)
AVChannelCustom * map
This member must be used when the channel order is AV_CHANNEL_ORDER_CUSTOM.
This structure describes decoded (raw) audio or video data.
@ AV_CHAN_TOP_SURROUND_LEFT
+110 degrees, Lvs, TpLS
static void complex_stereo_downmix_cur(AACDecContext *ac, ChannelElement *cpe, float *dmix_re)
uint8_t scale_factor_grouping
void(* apply_tns)(void *_coef_param, TemporalNoiseShaping *tns, IndividualChannelStream *ics, int decode)
SingleChannelElement ch[2]
static int ff_aac_sample_rate_idx(int rate)
const uint16_t *const ff_swb_offset_128[]
@ ID_CONFIG_EXT_STREAM_ID
static float win(SuperEqualizerContext *s, float n, int N)
int dmono_mode
0->not dmono, 1->use first channel, 2->use second channel
static void skip_bits(GetBitContext *s, int n)
struct AACUsacElemConfig::@23 mps
int num_swb
number of scalefactor window bands
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
@ AV_CHAN_SURROUND_DIRECT_LEFT
float coeffs[1024]
coefficients for IMDCT, maybe processed
AVChannelLayout ch_layout
Audio channel layout.
static int parse_ext_ele(AACDecContext *ac, AACUsacElemConfig *e, GetBitContext *gb)
@ ID_EXT_ELE_AUDIOPREROLL
#define SFB_PER_PRED_BAND
static int decode_spectrum_ac(AACDecContext *s, float coef[1024], GetBitContext *gb, AACArithState *state, int reset, uint16_t len, uint16_t N)
Decode and dequantize arithmetically coded, uniformly quantized value.
#define ue(name, range_min, range_max)
static double val(void *priv, double ch)
void(* sbr_apply)(AACDecContext *ac, ChannelElement *che, int id_aac, void *L, void *R)
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 type
#define us(width, name, range_min, range_max, subs,...)
IndividualChannelStream ics
AACUsacElemConfig elems[64]
static void complex_stereo_interpolate_imag(float *im, float *re, const float f[7], int len, int factor_even, int factor_odd)
@ AV_CHAN_BOTTOM_FRONT_LEFT
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
void(* dequant_scalefactors)(SingleChannelElement *sce)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
@ OC_GLOBAL_HDR
Output configuration set in a global header but not yet locked.
void(* apply_mid_side_stereo)(AACDecContext *ac, ChannelElement *cpe)
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
An AVChannelCustom defines a single channel within a custom order layout.
void ff_aac_ac_finish(AACArithState *state, int offset, int N)
static int decode_usac_scale_factors(AACDecContext *ac, SingleChannelElement *sce, GetBitContext *gb, uint8_t global_gain)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
ChannelElement * ff_aac_get_che(AACDecContext *ac, int type, int elem_id)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
uint8_t core_sbr_frame_len_idx
Individual Channel Stream.
#define SCALE_DIFF_ZERO
codebook index corresponding to zero scalefactor indices difference
const uint8_t ff_tns_max_bands_usac_1024[]
int ff_aac_usac_decode_frame(AVCodecContext *avctx, AACDecContext *ac, GetBitContext *gb, int *got_frame_ptr)
void ff_aac_ac_init(AACArith *ac, GetBitContext *gb)
static int decode_loudness_info(AACDecContext *ac, AACUSACLoudnessInfo *info, GetBitContext *gb)
@ AV_CHAN_SIDE_SURROUND_LEFT
+90 degrees, Lss, SiL
int ff_aac_ldp_parse_channel_stream(AACDecContext *ac, AACUSACConfig *usac, AACUsacElemData *ce, GetBitContext *gb)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
void(* vector_fmul_scalar)(float *dst, const float *src, float mul, int len)
Multiply a vector of floats by a scalar float.
uint8_t use_kb_window[2]
If set, use Kaiser-Bessel window, otherwise use a sine window.
const uint8_t ff_aac_num_swb_128[]
const uint8_t ff_tns_max_bands_usac_128[]
#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL
The specified retype target order is ignored and the simplest possible (canonical) order is used for ...
@ AV_CHAN_TOP_BACK_CENTER
static unsigned int get_bits1(GetBitContext *s)
uint8_t ms_mask[128]
Set if mid/side stereo is used for each scalefactor window band.
static int parse_audio_preroll(AACDecContext *ac, GetBitContext *gb)
static uint32_t get_escaped_value(GetBitContext *gb, int nb1, int nb2, int nb3)
@ AV_CHAN_BOTTOM_FRONT_RIGHT
uint8_t temp_shape_config
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static int decode_usac_stereo_cplx(AACDecContext *ac, AACUsacStereo *us, ChannelElement *cpe, GetBitContext *gb, int num_window_groups, int prev_num_window_groups, int indep_flag)
uint16_t ff_aac_ac_decode(AACArith *ac, GetBitContext *gb, const uint16_t *cdf, uint16_t cdf_len)
static void spectrum_scale(AACDecContext *ac, SingleChannelElement *sce, AACUsacElemData *ue)
@ OC_LOCKED
Output configuration locked in place.
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
@ AV_CHAN_FRONT_RIGHT_OF_CENTER
int prev_num_window_groups
Previous frame's number of window groups.
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
AACUsacElemData ue
USAC element data.
uint8_t layout_map[MAX_ELEM_ID *4][3]
enum WindowSequence window_sequence[2]
const uint16_t *const ff_swb_offset_1024[]
An AVChannelLayout holds information about the channel layout of audio data.
void(* imdct_and_windowing)(AACDecContext *ac, SingleChannelElement *sce)
uint8_t max_sfb_ste
(USAC) Maximum of both max_sfb values
@ ESC_BT
Spectral data are coded with an escape sequence.
int sfo[128]
scalefactor offsets
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
const float ff_aac_usac_mdst_filt_cur[4][4][7]
struct AACUsacElemConfig::@22::@25 dflt
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
int av_channel_layout_retype(AVChannelLayout *channel_layout, enum AVChannelOrder order, int flags)
Change the AVChannelOrder of a channel layout.
union AVChannelLayout::@414 u
Details about which channels are present in this layout.
@ AV_CHAN_TOP_FRONT_RIGHT
@ AV_CHANNEL_ORDER_NATIVE
The native channel order, i.e.
static void skip_bits1(GetBitContext *s)
uint32_t ff_aac_ac_get_context(AACArithState *state, uint32_t c, int i, int N)
@ AV_CHAN_FRONT_LEFT_OF_CENTER
enum BandType band_type[128]
band types
@ ID_CONFIG_EXT_LOUDNESS_INFO
float * output
PCM output.
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
uint32_t ff_aac_ac_get_pk(uint32_t c)
int av_channel_layout_custom_init(AVChannelLayout *channel_layout, int nb_channels)
Initialize a custom channel layout with the specified number of channels.
static void apply_noise_fill(AACDecContext *ac, SingleChannelElement *sce, AACUsacElemData *ue)
@ AV_CHAN_TOP_SURROUND_RIGHT
-110 degrees, Rvs, TpRS
@ AV_CHAN_SURROUND_DIRECT_RIGHT
Single Channel Element - used for both SCE and LFE elements.
const uint16_t *const ff_swb_offset_768[]
#define i(width, name, range_min, range_max)
static int decode_usac_element_pair(AACDecContext *ac, AACUsacElemConfig *e, GetBitContext *gb)
static enum AVChannel usac_ch_pos_to_av[64]
channel element - generic struct for SCE/CPE/CCE/LFE
const uint16_t * swb_offset
table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular wind...
int ff_aac_parse_fac_data(AACUsacElemData *ce, GetBitContext *gb, int use_gain, int len)
const int ff_aac_usac_samplerate[32]
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
static const float * complex_stereo_get_filter(ChannelElement *cpe, int is_prev)
void ff_aac_ac_update_context(AACArithState *state, int idx, uint16_t a, uint16_t b)
static const int8_t filt[NUMTAPS *2]
static void complex_stereo_downmix_prev(AACDecContext *ac, ChannelElement *cpe, float *dmix_re)
OutputConfiguration oc[2]
const uint8_t ff_aac_num_swb_96[]
uint32_t ff_aac_ac_map_process(AACArithState *state, int reset, int N)
static int decode_usac_sbr_data(AACDecContext *ac, AACUsacElemConfig *e, GetBitContext *gb)
const uint8_t ff_aac_num_swb_1024[]
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static void decode_usac_element_core(AACUsacElemConfig *e, GetBitContext *gb, int sbr_ratio)
main AAC decoding context
AACUSACLoudnessInfo info[64]
main external API structure.
@ AV_CHAN_LOW_FREQUENCY_2
struct AVCodecContext * avctx
static float noise_random_sign(unsigned int *seed)
static void apply_complex_stereo(AACDecContext *ac, ChannelElement *cpe)
struct AACUSACConfig::@26 loudness
static int setup_sce(AACDecContext *ac, SingleChannelElement *sce, AACUSACConfig *usac)
struct AACUsacElemConfig::@24 ext
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
int sbr
-1 implicit, 1 presence
Filter the word “frame” indicates either a video frame or a group of audio samples
int ff_aac_decode_tns(AACDecContext *ac, TemporalNoiseShaping *tns, GetBitContext *gb, const IndividualChannelStream *ics)
Decode Temporal Noise Shaping data; reference: table 4.48.
int ff_aac_usac_reset_state(AACDecContext *ac, OutputConfiguration *oc)
@ AV_CHAN_BOTTOM_FRONT_CENTER
static int decode_loudness_set(AACDecContext *ac, AACUSACConfig *usac, GetBitContext *gb)
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
@ AV_CHAN_TOP_FRONT_CENTER
@ AV_CHAN_SIDE_SURROUND_RIGHT
-90 degrees, Rss, SiR
AVChannelLayout ch_layout
int ff_aac_sbr_decode_usac_data(AACDecContext *ac, ChannelElement *che, AACUsacElemConfig *ue, GetBitContext *gb, int sbr_ch, int indep_flag)
Decode frame SBR data, USAC.
static int decode_usac_core_coder(AACDecContext *ac, AACUSACConfig *usac, AACUsacElemConfig *ec, ChannelElement *che, GetBitContext *gb, int indep_flag, int nb_channels)
void(* imdct_and_windowing_768)(AACDecContext *ac, SingleChannelElement *sce)
const uint16_t ff_aac_ac_msb_cdfs[64][17]
VLCElem ff_vlc_scalefactors[352]
uint8_t max_sfb
number of scalefactor bands per group
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int ff_aac_set_default_channel_config(AACDecContext *ac, AVCodecContext *avctx, uint8_t(*layout_map)[3], int *tags, int channel_config)
Set up channel positions based on a default channel configuration as specified in table 1....
int ff_aac_sbr_config_usac(AACDecContext *ac, ChannelElement *che, AACUsacElemConfig *ue)
Due to channel allocation not being known upon SBR parameter transmission, supply the parameters sepa...
const uint8_t ff_aac_num_swb_768[]
#define AV_PROFILE_AAC_USAC
int ff_aac_output_configure(AACDecContext *ac, uint8_t layout_map[MAX_ELEM_ID *4][3], int tags, enum OCStatus oc_type, int get_new_frame)
Configure output channel order based on the current program configuration element.
struct AACUsacElemData::@13 noise
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
AACUSACLoudnessInfo album_info[64]
const uint16_t *const ff_swb_offset_96[]
static int decode_usac_extension(AACDecContext *ac, AACUsacElemConfig *e, GetBitContext *gb)