libavcodec/aacenc.c
c03d9d05
 /*
  * AAC encoder
  * Copyright (C) 2008 Konstantin Shishkov
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /**
ba87f080
  * @file
c03d9d05
  * AAC encoder
  */
 
 /***********************************
  *              TODOs:
817015e4
  * add sane pulse detection
c03d9d05
  ***********************************/
 
2e4fd16f
 #include "libavutil/libm.h"
ec071926
 #include "libavutil/thread.h"
d5a7229b
 #include "libavutil/float_dsp.h"
cc9947ff
 #include "libavutil/opt.h"
c03d9d05
 #include "avcodec.h"
78e65cd7
 #include "put_bits.h"
ad95307f
 #include "internal.h"
c03d9d05
 #include "mpeg4audio.h"
a45fbda9
 #include "kbdwin.h"
4538729a
 #include "sinewin.h"
c03d9d05
 
 #include "aac.h"
 #include "aactab.h"
78e65cd7
 #include "aacenc.h"
c47c781e
 #include "aacenctab.h"
ef8e5a61
 #include "aacenc_utils.h"
78e65cd7
 
 #include "psymodel.h"
c03d9d05
 
ec071926
 static AVOnce aac_table_init = AV_ONCE_INIT;
 
9b8e2a87
 /**
c03d9d05
  * Make AAC audio config object.
  * @see 1.6.2.1 "Syntax - AudioSpecificConfig"
  */
 static void put_audio_specific_config(AVCodecContext *avctx)
 {
     PutBitContext pb;
     AACEncContext *s = avctx->priv_data;
b3deaece
     int channels = s->channels - (s->channels == 8 ? 1 : 0);
c03d9d05
 
50833c9f
     init_put_bits(&pb, avctx->extradata, avctx->extradata_size);
eab12d07
     put_bits(&pb, 5, s->profile+1); //profile
c03d9d05
     put_bits(&pb, 4, s->samplerate_index); //sample rate index
b3deaece
     put_bits(&pb, 4, channels);
c03d9d05
     //GASpecificConfig
     put_bits(&pb, 1, 0); //frame length - 1024 samples
     put_bits(&pb, 1, 0); //does not depend on core coder
     put_bits(&pb, 1, 0); //is not extension
d67a6aa5
 
     //Explicitly Mark SBR absent
604eb152
     put_bits(&pb, 11, 0x2b7); //sync extension
d67a6aa5
     put_bits(&pb, 5,  AOT_SBR);
     put_bits(&pb, 1,  0);
c03d9d05
     flush_put_bits(&pb);
 }
 
b629c67d
 void ff_quantize_band_cost_cache_init(struct AACEncContext *s)
 {
b91e3763
     ++s->quantize_band_cost_cache_generation;
     if (s->quantize_band_cost_cache_generation == 0) {
         memset(s->quantize_band_cost_cache, 0, sizeof(s->quantize_band_cost_cache));
         s->quantize_band_cost_cache_generation = 1;
b629c67d
     }
 }
 
9292fe4a
 #define WINDOW_FUNC(type) \
42d32469
 static void apply_ ##type ##_window(AVFloatDSPContext *fdsp, \
d5a7229b
                                     SingleChannelElement *sce, \
                                     const float *audio)
c03d9d05
 
9292fe4a
 WINDOW_FUNC(only_long)
 {
     const float *lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024;
     const float *pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024;
59b68ee8
     float *out = sce->ret_buf;
78e65cd7
 
42d32469
     fdsp->vector_fmul        (out,        audio,        lwindow, 1024);
     fdsp->vector_fmul_reverse(out + 1024, audio + 1024, pwindow, 1024);
9292fe4a
 }
78e65cd7
 
9292fe4a
 WINDOW_FUNC(long_start)
 {
     const float *lwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024;
     const float *swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
59b68ee8
     float *out = sce->ret_buf;
9292fe4a
 
d5a7229b
     fdsp->vector_fmul(out, audio, lwindow, 1024);
2e626dd5
     memcpy(out + 1024, audio + 1024, sizeof(out[0]) * 448);
42d32469
     fdsp->vector_fmul_reverse(out + 1024 + 448, audio + 1024 + 448, swindow, 128);
9292fe4a
     memset(out + 1024 + 576, 0, sizeof(out[0]) * 448);
 }
e29af818
 
9292fe4a
 WINDOW_FUNC(long_stop)
 {
     const float *lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024;
     const float *swindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
59b68ee8
     float *out = sce->ret_buf;
9292fe4a
 
     memset(out, 0, sizeof(out[0]) * 448);
d5a7229b
     fdsp->vector_fmul(out + 448, audio + 448, swindow, 128);
9292fe4a
     memcpy(out + 576, audio + 576, sizeof(out[0]) * 448);
42d32469
     fdsp->vector_fmul_reverse(out + 1024, audio + 1024, lwindow, 1024);
9292fe4a
 }
78e65cd7
 
9292fe4a
 WINDOW_FUNC(eight_short)
 {
     const float *swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
     const float *pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
     const float *in = audio + 448;
59b68ee8
     float *out = sce->ret_buf;
3715d841
     int w;
9292fe4a
 
3715d841
     for (w = 0; w < 8; w++) {
42d32469
         fdsp->vector_fmul        (out, in, w ? pwindow : swindow, 128);
9292fe4a
         out += 128;
         in  += 128;
42d32469
         fdsp->vector_fmul_reverse(out, in, swindow, 128);
9292fe4a
         out += 128;
     }
c03d9d05
 }
 
42d32469
 static void (*const apply_window[4])(AVFloatDSPContext *fdsp,
d5a7229b
                                      SingleChannelElement *sce,
                                      const float *audio) = {
9292fe4a
     [ONLY_LONG_SEQUENCE]   = apply_only_long_window,
     [LONG_START_SEQUENCE]  = apply_long_start_window,
     [EIGHT_SHORT_SEQUENCE] = apply_eight_short_window,
     [LONG_STOP_SEQUENCE]   = apply_long_stop_window
 };
 
04af2efa
 static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce,
                                   float *audio)
78e65cd7
 {
9292fe4a
     int i;
9006567b
     const float *output = sce->ret_buf;
78e65cd7
 
14285c33
     apply_window[sce->ics.window_sequence[0]](s->fdsp, sce, audio);
9292fe4a
 
     if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE)
26f548bb
         s->mdct1024.mdct_calc(&s->mdct1024, sce->coeffs, output);
9292fe4a
     else
         for (i = 0; i < 1024; i += 128)
32be264c
             s->mdct128.mdct_calc(&s->mdct128, &sce->coeffs[i], output + i*2);
9292fe4a
     memcpy(audio, audio + 1024, sizeof(audio[0]) * 1024);
6394acaf
     memcpy(sce->pcoeffs, sce->coeffs, sizeof(sce->pcoeffs));
78e65cd7
 }
 
c03d9d05
 /**
  * Encode ics_info element.
  * @see Table 4.6 (syntax of ics_info)
  */
e43b0a73
 static void put_ics_info(AACEncContext *s, IndividualChannelStream *info)
c03d9d05
 {
78e65cd7
     int w;
c03d9d05
 
     put_bits(&s->pb, 1, 0);                // ics_reserved bit
     put_bits(&s->pb, 2, info->window_sequence[0]);
     put_bits(&s->pb, 1, info->use_kb_window[0]);
fd257dc4
     if (info->window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
c03d9d05
         put_bits(&s->pb, 6, info->max_sfb);
76b81b10
         put_bits(&s->pb, 1, !!info->predictor_present);
fd257dc4
     } else {
c03d9d05
         put_bits(&s->pb, 4, info->max_sfb);
c8f47d8b
         for (w = 1; w < 8; w++)
78e65cd7
             put_bits(&s->pb, 1, !info->group_len[w]);
c03d9d05
     }
 }
 
 /**
78e65cd7
  * Encode MS data.
  * @see 4.6.8.1 "Joint Coding - M/S Stereo"
e43b0a73
  */
78e65cd7
 static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe)
e43b0a73
 {
     int i, w;
78e65cd7
 
     put_bits(pb, 2, cpe->ms_mode);
c8f47d8b
     if (cpe->ms_mode == 1)
         for (w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w])
fd257dc4
             for (i = 0; i < cpe->ch[0].ics.max_sfb; i++)
78e65cd7
                 put_bits(pb, 1, cpe->ms_mask[w*16 + i]);
 }
 
 /**
  * Produce integer coefficients from scalefactors provided by the model.
  */
72c758f1
 static void adjust_frame_information(ChannelElement *cpe, int chans)
78e65cd7
 {
     int i, w, w2, g, ch;
0b233900
     int maxsfb, cmaxsfb;
 
     for (ch = 0; ch < chans; ch++) {
         IndividualChannelStream *ics = &cpe->ch[ch].ics;
         maxsfb = 0;
         cpe->ch[ch].pulse.num_pulse = 0;
         for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
             for (w2 =  0; w2 < ics->group_len[w]; w2++) {
6394acaf
                 for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w*16+cmaxsfb-1]; cmaxsfb--)
                     ;
                 maxsfb = FFMAX(maxsfb, cmaxsfb);
78e65cd7
             }
         }
         ics->max_sfb = maxsfb;
 
         //adjust zero bands for window groups
fd257dc4
         for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
             for (g = 0; g < ics->max_sfb; g++) {
78e65cd7
                 i = 1;
fd257dc4
                 for (w2 = w; w2 < w + ics->group_len[w]; w2++) {
                     if (!cpe->ch[ch].zeroes[w2*16 + g]) {
78e65cd7
                         i = 0;
                         break;
                     }
                 }
                 cpe->ch[ch].zeroes[w*16 + g] = i;
             }
         }
     }
 
fd257dc4
     if (chans > 1 && cpe->common_window) {
78e65cd7
         IndividualChannelStream *ics0 = &cpe->ch[0].ics;
         IndividualChannelStream *ics1 = &cpe->ch[1].ics;
         int msc = 0;
         ics0->max_sfb = FFMAX(ics0->max_sfb, ics1->max_sfb);
         ics1->max_sfb = ics0->max_sfb;
fd257dc4
         for (w = 0; w < ics0->num_windows*16; w += 16)
             for (i = 0; i < ics0->max_sfb; i++)
c8f47d8b
                 if (cpe->ms_mask[w+i])
                     msc++;
99d61d34
         if (msc == 0 || ics0->max_sfb == 0)
             cpe->ms_mode = 0;
         else
98add74e
             cpe->ms_mode = msc < ics0->max_sfb * ics0->num_windows ? 1 : 2;
78e65cd7
     }
 }
 
20dc5271
 static void apply_intensity_stereo(ChannelElement *cpe)
 {
     int w, w2, g, i;
     IndividualChannelStream *ics = &cpe->ch[0].ics;
     if (!cpe->common_window)
         return;
     for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
         for (w2 =  0; w2 < ics->group_len[w]; w2++) {
             int start = (w+w2) * 128;
             for (g = 0; g < ics->num_swb; g++) {
                 int p  = -1 + 2 * (cpe->ch[1].band_type[w*16+g] - 14);
                 float scale = cpe->ch[0].is_ener[w*16+g];
                 if (!cpe->is_mask[w*16 + g]) {
                     start += ics->swb_sizes[g];
                     continue;
                 }
01ecb717
                 if (cpe->ms_mask[w*16 + g])
                     p *= -1;
20dc5271
                 for (i = 0; i < ics->swb_sizes[g]; i++) {
                     float sum = (cpe->ch[0].coeffs[start+i] + p*cpe->ch[1].coeffs[start+i])*scale;
                     cpe->ch[0].coeffs[start+i] = sum;
                     cpe->ch[1].coeffs[start+i] = 0.0f;
                 }
                 start += ics->swb_sizes[g];
             }
         }
     }
 }
 
 static void apply_mid_side_stereo(ChannelElement *cpe)
 {
     int w, w2, g, i;
     IndividualChannelStream *ics = &cpe->ch[0].ics;
     if (!cpe->common_window)
         return;
     for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
         for (w2 =  0; w2 < ics->group_len[w]; w2++) {
             int start = (w+w2) * 128;
             for (g = 0; g < ics->num_swb; g++) {
fc36d852
                 /* ms_mask can be used for other purposes in PNS and I/S,
                  * so must not apply M/S if any band uses either, even if
                  * ms_mask is set.
                  */
                 if (!cpe->ms_mask[w*16 + g] || cpe->is_mask[w*16 + g]
509f1680
                     || cpe->ch[0].band_type[w*16 + g] >= NOISE_BT
                     || cpe->ch[1].band_type[w*16 + g] >= NOISE_BT) {
20dc5271
                     start += ics->swb_sizes[g];
                     continue;
                 }
                 for (i = 0; i < ics->swb_sizes[g]; i++) {
                     float L = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) * 0.5f;
                     float R = L - cpe->ch[1].coeffs[start+i];
                     cpe->ch[0].coeffs[start+i] = L;
                     cpe->ch[1].coeffs[start+i] = R;
                 }
                 start += ics->swb_sizes[g];
             }
         }
     }
 }
 
78e65cd7
 /**
  * Encode scalefactor band coding type.
  */
 static void encode_band_info(AACEncContext *s, SingleChannelElement *sce)
 {
     int w;
 
20dc5271
     if (s->coder->set_special_band_scalefactors)
         s->coder->set_special_band_scalefactors(s, sce);
 
c8f47d8b
     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
78e65cd7
         s->coder->encode_window_bands_info(s, sce, w, sce->ics.group_len[w], s->lambda);
 }
 
 /**
  * Encode scalefactors.
  */
99d61d34
 static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s,
                                  SingleChannelElement *sce)
78e65cd7
 {
013498ba
     int diff, off_sf = sce->sf_idx[0], off_pns = sce->sf_idx[0] - NOISE_OFFSET;
7c10b87b
     int off_is = 0, noise_flag = 1;
78e65cd7
     int i, w;
 
fd257dc4
     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
         for (i = 0; i < sce->ics.max_sfb; i++) {
             if (!sce->zeroes[w*16 + i]) {
f7f71b57
                 if (sce->band_type[w*16 + i] == NOISE_BT) {
                     diff = sce->sf_idx[w*16 + i] - off_pns;
                     off_pns = sce->sf_idx[w*16 + i];
                     if (noise_flag-- > 0) {
                         put_bits(&s->pb, NOISE_PRE_BITS, diff + NOISE_PRE);
                         continue;
                     }
7c10b87b
                 } else if (sce->band_type[w*16 + i] == INTENSITY_BT  ||
                            sce->band_type[w*16 + i] == INTENSITY_BT2) {
                     diff = sce->sf_idx[w*16 + i] - off_is;
                     off_is = sce->sf_idx[w*16 + i];
f7f71b57
                 } else {
                     diff = sce->sf_idx[w*16 + i] - off_sf;
                     off_sf = sce->sf_idx[w*16 + i];
                 }
                 diff += SCALE_DIFF_ZERO;
f69f9b38
                 av_assert0(diff >= 0 && diff <= 120);
78e65cd7
                 put_bits(&s->pb, ff_aac_scalefactor_bits[diff], ff_aac_scalefactor_code[diff]);
             }
e43b0a73
         }
     }
 }
 
 /**
817015e4
  * Encode pulse data.
  */
cda00def
 static void encode_pulses(AACEncContext *s, Pulse *pulse)
817015e4
 {
     int i;
 
     put_bits(&s->pb, 1, !!pulse->num_pulse);
99d61d34
     if (!pulse->num_pulse)
         return;
817015e4
 
     put_bits(&s->pb, 2, pulse->num_pulse - 1);
     put_bits(&s->pb, 6, pulse->start);
fd257dc4
     for (i = 0; i < pulse->num_pulse; i++) {
f5c3eae3
         put_bits(&s->pb, 5, pulse->pos[i]);
817015e4
         put_bits(&s->pb, 4, pulse->amp[i]);
     }
 }
 
 /**
  * Encode spectral coefficients processed by psychoacoustic model.
  */
cda00def
 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce)
817015e4
 {
78e65cd7
     int start, i, w, w2;
817015e4
 
fd257dc4
     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
817015e4
         start = 0;
fd257dc4
         for (i = 0; i < sce->ics.max_sfb; i++) {
             if (sce->zeroes[w*16 + i]) {
cda00def
                 start += sce->ics.swb_sizes[i];
817015e4
                 continue;
             }
44ddee94
             for (w2 = w; w2 < w + sce->ics.group_len[w]; w2++) {
43b378a0
                 s->coder->quantize_and_encode_band(s, &s->pb,
                                                    &sce->coeffs[start + w2*128],
44ddee94
                                                    NULL, sce->ics.swb_sizes[i],
99d61d34
                                                    sce->sf_idx[w*16 + i],
                                                    sce->band_type[w*16 + i],
43b378a0
                                                    s->lambda,
                                                    sce->ics.window_clipping[w]);
44ddee94
             }
cda00def
             start += sce->ics.swb_sizes[i];
817015e4
         }
     }
 }
 
 /**
59216e05
  * Downscale spectral coefficients for near-clipping windows to avoid artifacts
  */
 static void avoid_clipping(AACEncContext *s, SingleChannelElement *sce)
 {
     int start, i, j, w;
 
     if (sce->ics.clip_avoidance_factor < 1.0f) {
         for (w = 0; w < sce->ics.num_windows; w++) {
             start = 0;
             for (i = 0; i < sce->ics.max_sfb; i++) {
32be264c
                 float *swb_coeffs = &sce->coeffs[start + w*128];
59216e05
                 for (j = 0; j < sce->ics.swb_sizes[i]; j++)
                     swb_coeffs[j] *= sce->ics.clip_avoidance_factor;
                 start += sce->ics.swb_sizes[i];
             }
         }
     }
 }
 
 /**
78e65cd7
  * Encode one channel of audio data.
  */
99d61d34
 static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s,
                                      SingleChannelElement *sce,
                                      int common_window)
78e65cd7
 {
     put_bits(&s->pb, 8, sce->sf_idx[0]);
76b81b10
     if (!common_window) {
99d61d34
         put_ics_info(s, &sce->ics);
76b81b10
         if (s->coder->encode_main_pred)
             s->coder->encode_main_pred(s, sce);
27d23ae0
         if (s->coder->encode_ltp_info)
             s->coder->encode_ltp_info(s, sce, 0);
76b81b10
     }
78e65cd7
     encode_band_info(s, sce);
     encode_scale_factors(avctx, s, sce);
     encode_pulses(s, &sce->pulse);
f20b6717
     put_bits(&s->pb, 1, !!sce->tns.present);
a1c487e9
     if (s->coder->encode_tns_info)
         s->coder->encode_tns_info(s, sce);
78e65cd7
     put_bits(&s->pb, 1, 0); //ssr
     encode_spectral_coeffs(s, sce);
     return 0;
 }
 
 /**
c03d9d05
  * Write some auxiliary information about the created AAC file.
  */
72c758f1
 static void put_bitstream_info(AACEncContext *s, const char *name)
c03d9d05
 {
     int i, namelen, padbits;
 
     namelen = strlen(name) + 2;
f5c3eae3
     put_bits(&s->pb, 3, TYPE_FIL);
c03d9d05
     put_bits(&s->pb, 4, FFMIN(namelen, 15));
fd257dc4
     if (namelen >= 15)
018a6645
         put_bits(&s->pb, 8, namelen - 14);
c03d9d05
     put_bits(&s->pb, 4, 0); //extension type - filler
efe68076
     padbits = -put_bits_count(&s->pb) & 7;
9f51c682
     avpriv_align_put_bits(&s->pb);
fd257dc4
     for (i = 0; i < namelen - 2; i++)
c03d9d05
         put_bits(&s->pb, 8, name[i]);
     put_bits(&s->pb, 12 - padbits, 0);
 }
 
9b8e2a87
 /*
f3e2d68d
  * Copy input samples.
4b4d3d72
  * Channels are reordered from libavcodec's default order to AAC order.
9b8e2a87
  */
f3e2d68d
 static void copy_input_samples(AACEncContext *s, const AVFrame *frame)
9b8e2a87
 {
f3e2d68d
     int ch;
     int end = 2048 + (frame ? frame->nb_samples : 0);
     const uint8_t *channel_map = aac_chan_maps[s->channels - 1];
9b8e2a87
 
f3e2d68d
     /* copy and remap input samples */
     for (ch = 0; ch < s->channels; ch++) {
9b8e2a87
         /* copy last 1024 samples of previous frame to the start of the current frame */
dc7e7d4d
         memcpy(&s->planar_samples[ch][1024], &s->planar_samples[ch][2048], 1024 * sizeof(s->planar_samples[0][0]));
9b8e2a87
 
f3e2d68d
         /* copy new samples and zero any remaining samples */
ad95307f
         if (frame) {
f3e2d68d
             memcpy(&s->planar_samples[ch][2048],
                    frame->extended_data[channel_map[ch]],
                    frame->nb_samples * sizeof(s->planar_samples[0][0]));
9b8e2a87
         }
f3e2d68d
         memset(&s->planar_samples[ch][end], 0,
                (3072 - end) * sizeof(s->planar_samples[0][0]));
9b8e2a87
     }
 }
 
ad95307f
 static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
                             const AVFrame *frame, int *got_packet_ptr)
78e65cd7
 {
     AACEncContext *s = avctx->priv_data;
7946a5ac
     float **samples = s->planar_samples, *samples2, *la, *overlap;
78e65cd7
     ChannelElement *cpe;
d1ca7142
     SingleChannelElement *sce;
2d9b5ae0
     IndividualChannelStream *ics;
7ec74ae4
     int i, its, ch, w, chans, tag, start_ch, ret, frame_bits;
01ecb717
     int target_bits, rate_bits, too_many_bits, too_few_bits;
d1ca7142
     int ms_mode = 0, is_mode = 0, tns_mode = 0, pred_mode = 0;
78e65cd7
     int chan_el_counter[4];
86e41bc3
     FFPsyWindowInfo windows[AAC_MAX_CHANNELS];
78e65cd7
 
ad95307f
     /* add current frame to queue */
     if (frame) {
98fed594
         if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
ad95307f
             return ret;
0cf68538
     } else {
         if (!s->afq.remaining_samples || (!s->afq.frame_alloc && !s->afq.frame_count))
             return 0;
ad95307f
     }
 
f3e2d68d
     copy_input_samples(s, frame);
89eea6df
     if (s->psypp)
         ff_psy_preprocess(s->psypp, s->planar_samples, s->channels);
9b8e2a87
 
     if (!avctx->frame_number)
78e65cd7
         return 0;
 
     start_ch = 0;
1bb52045
     for (i = 0; i < s->chan_map[0]; i++) {
5962f6b0
         FFPsyWindowInfo* wi = windows + start_ch;
1bb52045
         tag      = s->chan_map[i+1];
99d61d34
         chans    = tag == TYPE_CPE ? 2 : 1;
         cpe      = &s->cpe[i];
5b29af62
         for (ch = 0; ch < chans; ch++) {
2cb8edea
             int k;
c38a6077
             float clip_avoidance_factor;
2d9b5ae0
             sce = &cpe->ch[ch];
             ics = &sce->ics;
             s->cur_channel = start_ch + ch;
             overlap  = &samples[s->cur_channel][0];
7946a5ac
             samples2 = overlap + 1024;
9b8e2a87
             la       = samples2 + (448+64);
ad95307f
             if (!frame)
2bb1d0e7
                 la = NULL;
03d5d9b9
             if (tag == TYPE_LFE) {
8005b6de
                 wi[ch].window_type[0] = wi[ch].window_type[1] = ONLY_LONG_SEQUENCE;
5b29af62
                 wi[ch].window_shape   = 0;
                 wi[ch].num_windows    = 1;
                 wi[ch].grouping[0]    = 1;
8005b6de
                 wi[ch].clipping[0]    = 0;
24efdea7
 
                 /* Only the lowest 12 coefficients are used in a LFE channel.
                  * The expression below results in only the bottom 8 coefficients
                  * being used for 11.025kHz to 16kHz sample rates.
                  */
                 ics->num_swb = s->samplerate_index >= 8 ? 1 : 3;
03d5d9b9
             } else {
2d9b5ae0
                 wi[ch] = s->psy.model->window(&s->psy, samples2, la, s->cur_channel,
26784384
                                               ics->window_sequence[0]);
03d5d9b9
             }
78e65cd7
             ics->window_sequence[1] = ics->window_sequence[0];
5b29af62
             ics->window_sequence[0] = wi[ch].window_type[0];
78e65cd7
             ics->use_kb_window[1]   = ics->use_kb_window[0];
5b29af62
             ics->use_kb_window[0]   = wi[ch].window_shape;
             ics->num_windows        = wi[ch].num_windows;
78e65cd7
             ics->swb_sizes          = s->psy.bands    [ics->num_windows == 8];
24efdea7
             ics->num_swb            = tag == TYPE_LFE ? ics->num_swb : s->psy.num_bands[ics->num_windows == 8];
5b0da699
             ics->max_sfb            = FFMIN(ics->max_sfb, ics->num_swb);
23e786be
             ics->swb_offset         = wi[ch].window_type[0] == EIGHT_SHORT_SEQUENCE ?
                                         ff_swb_offset_128 [s->samplerate_index]:
                                         ff_swb_offset_1024[s->samplerate_index];
5ed5ca70
             ics->tns_max_bands      = wi[ch].window_type[0] == EIGHT_SHORT_SEQUENCE ?
                                         ff_tns_max_bands_128 [s->samplerate_index]:
                                         ff_tns_max_bands_1024[s->samplerate_index];
8005b6de
 
5b29af62
             for (w = 0; w < ics->num_windows; w++)
                 ics->group_len[w] = wi[ch].grouping[w];
8005b6de
 
             /* Calculate input sample maximums and evaluate clipping risk */
             clip_avoidance_factor = 0.0f;
             for (w = 0; w < ics->num_windows; w++) {
                 const float *wbuf = overlap + w * 128;
                 const int wlen = 2048 / ics->num_windows;
                 float max = 0;
                 int j;
                 /* mdct input is 2 * output */
                 for (j = 0; j < wlen; j++)
                     max = FFMAX(max, fabsf(wbuf[j]));
                 wi[ch].clipping[w] = max;
             }
59216e05
             for (w = 0; w < ics->num_windows; w++) {
                 if (wi[ch].clipping[w] > CLIP_AVOIDANCE_FACTOR) {
                     ics->window_clipping[w] = 1;
                     clip_avoidance_factor = FFMAX(clip_avoidance_factor, wi[ch].clipping[w]);
                 } else {
                     ics->window_clipping[w] = 0;
                 }
             }
             if (clip_avoidance_factor > CLIP_AVOIDANCE_FACTOR) {
                 ics->clip_avoidance_factor = CLIP_AVOIDANCE_FACTOR / clip_avoidance_factor;
             } else {
                 ics->clip_avoidance_factor = 1.0f;
             }
78e65cd7
 
2d9b5ae0
             apply_window_and_mdct(s, sce, overlap);
27d23ae0
 
             if (s->options.ltp && s->coder->update_ltp) {
                 s->coder->update_ltp(s, sce);
                 apply_window[sce->ics.window_sequence[0]](s->fdsp, sce, &sce->ltp_state[0]);
                 s->mdct1024.mdct_calc(&s->mdct1024, sce->lcoeffs, sce->ret_buf);
             }
 
2cb8edea
             for (k = 0; k < 1024; k++) {
77bf96b0
                 if (!(fabs(cpe->ch[ch].coeffs[k]) < 1E16)) { // Ensure headroom for energy calculation
                     av_log(avctx, AV_LOG_ERROR, "Input contains (near) NaN/+-Inf\n");
2cb8edea
                     return AVERROR(EINVAL);
                 }
f9fa5605
             }
2d9b5ae0
             avoid_clipping(s, sce);
5962f6b0
         }
         start_ch += chans;
     }
e36db49b
     if ((ret = ff_alloc_packet2(avctx, avpkt, 8192 * s->channels, 0)) < 0)
ecd7455e
         return ret;
7ec74ae4
     frame_bits = its = 0;
48d20c11
     do {
ad95307f
         init_put_bits(&s->pb, avpkt->data, avpkt->size);
 
7c6eb0a1
         if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & AV_CODEC_FLAG_BITEXACT))
72c758f1
             put_bitstream_info(s, LIBAVCODEC_IDENT);
f11bfe30
         start_ch = 0;
7ec74ae4
         target_bits = 0;
f11bfe30
         memset(chan_el_counter, 0, sizeof(chan_el_counter));
1bb52045
         for (i = 0; i < s->chan_map[0]; i++) {
f11bfe30
             FFPsyWindowInfo* wi = windows + start_ch;
01344fe4
             const float *coeffs[2];
1bb52045
             tag      = s->chan_map[i+1];
f11bfe30
             chans    = tag == TYPE_CPE ? 2 : 1;
             cpe      = &s->cpe[i];
a0079aae
             cpe->common_window = 0;
9f4f5787
             memset(cpe->is_mask, 0, sizeof(cpe->is_mask));
             memset(cpe->ms_mask, 0, sizeof(cpe->ms_mask));
8e4c11e9
             put_bits(&s->pb, 3, tag);
             put_bits(&s->pb, 4, chan_el_counter[tag]++);
e6c9f3a1
             for (ch = 0; ch < chans; ch++) {
                 sce = &cpe->ch[ch];
                 coeffs[ch] = sce->coeffs;
76b81b10
                 sce->ics.predictor_present = 0;
27d23ae0
                 sce->ics.ltp.present = 0;
                 memset(sce->ics.ltp.used, 0, sizeof(sce->ics.ltp.used));
3f3be1c0
                 memset(sce->ics.prediction_used, 0, sizeof(sce->ics.prediction_used));
a1c487e9
                 memset(&sce->tns, 0, sizeof(TemporalNoiseShaping));
e6c9f3a1
                 for (w = 0; w < 128; w++)
                     if (sce->band_type[w] > RESERVED_BT)
                         sce->band_type[w] = 0;
             }
7ec74ae4
             s->psy.bitres.alloc = -1;
4386f17b
             s->psy.bitres.bits = s->last_frame_pb_count / s->channels;
d3a6c2ab
             s->psy.model->analyze(&s->psy, start_ch, coeffs, wi);
7ec74ae4
             if (s->psy.bitres.alloc > 0) {
                 /* Lambda unused here on purpose, we need to take psy's unscaled allocation */
01ecb717
                 target_bits += s->psy.bitres.alloc
                     * (s->lambda / (avctx->global_quality ? avctx->global_quality : 120));
7ec74ae4
                 s->psy.bitres.alloc /= chans;
             }
             s->cur_type = tag;
5b29af62
             for (ch = 0; ch < chans; ch++) {
e41cd3cd
                 s->cur_channel = start_ch + ch;
01ecb717
                 if (s->options.pns && s->coder->mark_pns)
                     s->coder->mark_pns(s, avctx, &cpe->ch[ch]);
5b29af62
                 s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda);
f11bfe30
             }
             if (chans > 1
                 && wi[0].window_type[0] == wi[1].window_type[0]
                 && wi[0].window_shape   == wi[1].window_shape) {
 
                 cpe->common_window = 1;
5b29af62
                 for (w = 0; w < wi[0].num_windows; w++) {
                     if (wi[0].grouping[w] != wi[1].grouping[w]) {
f11bfe30
                         cpe->common_window = 0;
                         break;
                     }
78e65cd7
                 }
             }
20dc5271
             for (ch = 0; ch < chans; ch++) { /* TNS and PNS */
a1c487e9
                 sce = &cpe->ch[ch];
                 s->cur_channel = start_ch + ch;
                 if (s->options.tns && s->coder->search_for_tns)
                     s->coder->search_for_tns(s, sce);
f20b6717
                 if (s->options.tns && s->coder->apply_tns_filt)
f3f6c6b9
                     s->coder->apply_tns_filt(s, sce);
a1c487e9
                 if (sce->tns.present)
                     tns_mode = 1;
b32e989e
                 if (s->options.pns && s->coder->search_for_pns)
                     s->coder->search_for_pns(s, avctx, sce);
38fd4c2e
             }
e41cd3cd
             s->cur_channel = start_ch;
20dc5271
             if (s->options.intensity_stereo) { /* Intensity Stereo */
                 if (s->coder->search_for_is)
                     s->coder->search_for_is(s, avctx, cpe);
e8576dc8
                 if (cpe->is_mode) is_mode = 1;
20dc5271
                 apply_intensity_stereo(cpe);
e8576dc8
             }
20dc5271
             if (s->options.pred) { /* Prediction */
                 for (ch = 0; ch < chans; ch++) {
                     sce = &cpe->ch[ch];
                     s->cur_channel = start_ch + ch;
                     if (s->options.pred && s->coder->search_for_pred)
                         s->coder->search_for_pred(s, sce);
                     if (cpe->ch[ch].ics.predictor_present) pred_mode = 1;
                 }
93e6b23c
                 if (s->coder->adjust_common_pred)
                     s->coder->adjust_common_pred(s, cpe);
20dc5271
                 for (ch = 0; ch < chans; ch++) {
                     sce = &cpe->ch[ch];
                     s->cur_channel = start_ch + ch;
                     if (s->options.pred && s->coder->apply_main_pred)
                         s->coder->apply_main_pred(s, sce);
                 }
                 s->cur_channel = start_ch;
44ddee94
             }
0f4334df
             if (s->options.mid_side) { /* Mid/Side stereo */
                 if (s->options.mid_side == -1 && s->coder->search_for_ms)
20dc5271
                     s->coder->search_for_ms(s, cpe);
                 else if (cpe->common_window)
                     memset(cpe->ms_mask, 1, sizeof(cpe->ms_mask));
                 apply_mid_side_stereo(cpe);
44ddee94
             }
20dc5271
             adjust_frame_information(cpe, chans);
27d23ae0
             if (s->options.ltp) { /* LTP */
                 for (ch = 0; ch < chans; ch++) {
                     sce = &cpe->ch[ch];
                     s->cur_channel = start_ch + ch;
                     if (s->coder->search_for_ltp)
                         s->coder->search_for_ltp(s, sce, cpe->common_window);
                     if (sce->ics.ltp.present) pred_mode = 1;
                 }
                 s->cur_channel = start_ch;
                 if (s->coder->adjust_common_ltp)
                     s->coder->adjust_common_ltp(s, cpe);
             }
f11bfe30
             if (chans == 2) {
                 put_bits(&s->pb, 1, cpe->common_window);
                 if (cpe->common_window) {
                     put_ics_info(s, &cpe->ch[0].ics);
76b81b10
                     if (s->coder->encode_main_pred)
                         s->coder->encode_main_pred(s, &cpe->ch[0]);
27d23ae0
                     if (s->coder->encode_ltp_info)
                         s->coder->encode_ltp_info(s, &cpe->ch[0], 1);
f11bfe30
                     encode_ms_info(&s->pb, cpe);
6394acaf
                     if (cpe->ms_mode) ms_mode = 1;
f11bfe30
                 }
78e65cd7
             }
5b29af62
             for (ch = 0; ch < chans; ch++) {
                 s->cur_channel = start_ch + ch;
                 encode_individual_channel(avctx, s, &cpe->ch[ch], cpe->common_window);
f11bfe30
             }
             start_ch += chans;
78e65cd7
         }
 
f5c8d004
         if (avctx->flags & AV_CODEC_FLAG_QSCALE) {
7ec74ae4
             /* When using a constant Q-scale, don't mess with lambda */
48d20c11
             break;
230c1a90
         }
48d20c11
 
7ec74ae4
         /* rate control stuff
01ecb717
          * allow between the nominal bitrate, and what psy's bit reservoir says to target
          * but drift towards the nominal bitrate always
7ec74ae4
          */
         frame_bits = put_bits_count(&s->pb);
01ecb717
         rate_bits = avctx->bit_rate * 1024 / avctx->sample_rate;
         rate_bits = FFMIN(rate_bits, 6144 * s->channels - 3);
         too_many_bits = FFMAX(target_bits, rate_bits);
         too_many_bits = FFMIN(too_many_bits, 6144 * s->channels - 3);
         too_few_bits = FFMIN(FFMAX(rate_bits - rate_bits/4, target_bits), too_many_bits);
7ec74ae4
 
         /* When using ABR, be strict (but only for increasing) */
01ecb717
         too_few_bits = too_few_bits - too_few_bits/8;
         too_many_bits = too_many_bits + too_many_bits/2;
7ec74ae4
 
         if (   its == 0 /* for steady-state Q-scale tracking */
             || (its < 5 && (frame_bits < too_few_bits || frame_bits > too_many_bits))
             || frame_bits >= 6144 * s->channels - 3  )
         {
01ecb717
             float ratio = ((float)rate_bits) / frame_bits;
7ec74ae4
 
             if (frame_bits >= too_few_bits && frame_bits <= too_many_bits) {
                 /*
                  * This path is for steady-state Q-scale tracking
                  * When frame bits fall within the stable range, we still need to adjust
                  * lambda to maintain it like so in a stable fashion (large jumps in lambda
                  * create artifacts and should be avoided), but slowly
                  */
                 ratio = sqrtf(sqrtf(ratio));
                 ratio = av_clipf(ratio, 0.9f, 1.1f);
             } else {
                 /* Not so fast though */
                 ratio = sqrtf(ratio);
             }
             s->lambda = FFMIN(s->lambda * ratio, 65536.f);
48d20c11
 
7ec74ae4
             /* Keep iterating if we must reduce and lambda is in the sky */
ca203e99
             if (ratio > 0.9f && ratio < 1.1f) {
7ec74ae4
                 break;
             } else {
                 if (is_mode || ms_mode || tns_mode || pred_mode) {
                     for (i = 0; i < s->chan_map[0]; i++) {
                         // Must restore coeffs
                         chans = tag == TYPE_CPE ? 2 : 1;
                         cpe = &s->cpe[i];
                         for (ch = 0; ch < chans; ch++)
                             memcpy(cpe->ch[ch].coeffs, cpe->ch[ch].pcoeffs, sizeof(cpe->ch[ch].coeffs));
                     }
                 }
                 its++;
             }
         } else {
             break;
         }
48d20c11
     } while (1);
 
27d23ae0
     if (s->options.ltp && s->coder->ltp_insert_new_frame)
         s->coder->ltp_insert_new_frame(s);
 
78e65cd7
     put_bits(&s->pb, 3, TYPE_END);
     flush_put_bits(&s->pb);
362028ca
 
4386f17b
     s->last_frame_pb_count = put_bits_count(&s->pb);
78e65cd7
 
01ecb717
     s->lambda_sum += s->lambda;
     s->lambda_count++;
78e65cd7
 
ad95307f
     ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
                        &avpkt->duration);
 
     avpkt->size = put_bits_count(&s->pb) >> 3;
     *got_packet_ptr = 1;
     return 0;
78e65cd7
 }
 
c03d9d05
 static av_cold int aac_encode_end(AVCodecContext *avctx)
 {
     AACEncContext *s = avctx->priv_data;
 
01ecb717
     av_log(avctx, AV_LOG_INFO, "Qavg: %.3f\n", s->lambda_sum / s->lambda_count);
 
c03d9d05
     ff_mdct_end(&s->mdct1024);
     ff_mdct_end(&s->mdct128);
78e65cd7
     ff_psy_end(&s->psy);
b47a1e5c
     ff_lpc_end(&s->lpc);
53107041
     if (s->psypp)
         ff_psy_preprocess_end(s->psypp);
9b8e2a87
     av_freep(&s->buffer.samples);
c03d9d05
     av_freep(&s->cpe);
14285c33
     av_freep(&s->fdsp);
ad95307f
     ff_af_queue_close(&s->afq);
c03d9d05
     return 0;
 }
 
53107041
 static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
 {
     int ret = 0;
 
94d68a41
     s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
14285c33
     if (!s->fdsp)
         return AVERROR(ENOMEM);
53107041
 
     // window init
     ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
     ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
     ff_init_ff_sine_windows(10);
     ff_init_ff_sine_windows(7);
 
3fb726c6
     if ((ret = ff_mdct_init(&s->mdct1024, 11, 0, 32768.0)) < 0)
53107041
         return ret;
3fb726c6
     if ((ret = ff_mdct_init(&s->mdct128,   8, 0, 32768.0)) < 0)
53107041
         return ret;
 
     return 0;
 }
 
 static av_cold int alloc_buffers(AVCodecContext *avctx, AACEncContext *s)
 {
3715d841
     int ch;
c4a0c64f
     FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->buffer.samples, s->channels, 3 * 1024 * sizeof(s->buffer.samples[0]), alloc_fail);
     FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->cpe, s->chan_map[0], sizeof(ChannelElement), alloc_fail);
059a9348
     FF_ALLOCZ_OR_GOTO(avctx, avctx->extradata, 5 + AV_INPUT_BUFFER_PADDING_SIZE, alloc_fail);
53107041
 
3715d841
     for(ch = 0; ch < s->channels; ch++)
7946a5ac
         s->planar_samples[ch] = s->buffer.samples + 3 * 1024 * ch;
9b8e2a87
 
53107041
     return 0;
 alloc_fail:
     return AVERROR(ENOMEM);
 }
 
6b407551
 static av_cold void aac_encode_init_tables(void)
 {
     ff_aac_tableinit();
 }
 
53107041
 static av_cold int aac_encode_init(AVCodecContext *avctx)
 {
     AACEncContext *s = avctx->priv_data;
     int i, ret = 0;
     const uint8_t *sizes[2];
     uint8_t grouping[AAC_MAX_CHANNELS];
     int lengths[2];
 
f0a82124
     /* Constants */
4386f17b
     s->last_frame_pb_count = 0;
0f4334df
     avctx->extradata_size = 5;
53107041
     avctx->frame_size = 1024;
0f4334df
     avctx->initial_padding = 1024;
f0a82124
     s->lambda = avctx->global_quality > 0 ? avctx->global_quality : 120;
 
     /* Channel map and unspecified bitrate guessing */
     s->channels = avctx->channels;
     ERROR_IF(s->channels > AAC_MAX_CHANNELS || s->channels == 7,
              "Unsupported number of channels: %d\n", s->channels);
     s->chan_map = aac_chan_configs[s->channels-1];
     if (!avctx->bit_rate) {
         for (i = 1; i <= s->chan_map[0]; i++) {
             avctx->bit_rate += s->chan_map[i] == TYPE_CPE ? 128000 : /* Pair */
                                s->chan_map[i] == TYPE_LFE ? 16000  : /* LFE  */
                                                             69000  ; /* SCE  */
         }
     }
53107041
 
f0a82124
     /* Samplerate */
53107041
     for (i = 0; i < 16; i++)
         if (avctx->sample_rate == avpriv_mpeg4audio_sample_rates[i])
             break;
0f4334df
     s->samplerate_index = i;
     ERROR_IF(s->samplerate_index == 16 ||
              s->samplerate_index >= ff_aac_swb_size_1024_len ||
              s->samplerate_index >= ff_aac_swb_size_128_len,
53107041
              "Unsupported sample rate %d\n", avctx->sample_rate);
f0a82124
 
     /* Bitrate limiting */
6dbbb981
     WARN_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels,
92186f2d
              "Too many bits %f > %d per frame requested, clamping to max\n",
b805482b
              1024.0 * avctx->bit_rate / avctx->sample_rate,
              6144 * s->channels);
f0a82124
     avctx->bit_rate = (int64_t)FFMIN(6144 * s->channels / 1024.0 * avctx->sample_rate,
                                      avctx->bit_rate);
0f4334df
 
f0a82124
     /* Profile and option setting */
     avctx->profile = avctx->profile == FF_PROFILE_UNKNOWN ? FF_PROFILE_AAC_LOW :
                      avctx->profile;
e9299df7
     for (i = 0; i < FF_ARRAY_ELEMS(aacenc_profiles); i++)
         if (avctx->profile == aacenc_profiles[i])
0f4334df
             break;
e9299df7
     if (avctx->profile == FF_PROFILE_MPEG2_AAC_LOW) {
         avctx->profile = FF_PROFILE_AAC_LOW;
         ERROR_IF(s->options.pred,
                  "Main prediction unavailable in the \"mpeg2_aac_low\" profile\n");
         ERROR_IF(s->options.ltp,
                  "LTP prediction unavailable in the \"mpeg2_aac_low\" profile\n");
         WARN_IF(s->options.pns,
                 "PNS unavailable in the \"mpeg2_aac_low\" profile, turning off\n");
         s->options.pns = 0;
     } else if (avctx->profile == FF_PROFILE_AAC_LTP) {
         s->options.ltp = 1;
         ERROR_IF(s->options.pred,
                  "Main prediction unavailable in the \"aac_ltp\" profile\n");
     } else if (avctx->profile == FF_PROFILE_AAC_MAIN) {
         s->options.pred = 1;
         ERROR_IF(s->options.ltp,
                  "LTP prediction unavailable in the \"aac_main\" profile\n");
     } else if (s->options.ltp) {
         avctx->profile = FF_PROFILE_AAC_LTP;
         WARN_IF(1,
                 "Chainging profile to \"aac_ltp\"\n");
         ERROR_IF(s->options.pred,
                  "Main prediction unavailable in the \"aac_ltp\" profile\n");
     } else if (s->options.pred) {
         avctx->profile = FF_PROFILE_AAC_MAIN;
         WARN_IF(1,
                 "Chainging profile to \"aac_main\"\n");
3112501d
         ERROR_IF(s->options.ltp,
e9299df7
                  "LTP prediction unavailable in the \"aac_main\" profile\n");
eab12d07
     }
e9299df7
     s->profile = avctx->profile;
6dbbb981
 
f0a82124
     /* Coder limitations */
     s->coder = &ff_aac_coders[s->options.coder];
fb0abb34
     if (s->options.coder == AAC_CODER_ANMR) {
b270ec9a
         ERROR_IF(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL,
6612d049
                  "The ANMR coder is considered experimental, add -strict -2 to enable!\n");
8ffe1cb4
         s->options.intensity_stereo = 0;
         s->options.pns = 0;
     }
a72b1ea8
     ERROR_IF(s->options.ltp && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL,
              "The LPT profile requires experimental compliance, add -strict -2 to enable!\n");
 
0fe0e213
     /* M/S introduces horrible artifacts with multichannel files, this is temporary */
     if (s->channels > 3)
         s->options.mid_side = 0;
 
971099ff
     if ((ret = dsp_init(avctx, s)) < 0)
53107041
         goto fail;
 
971099ff
     if ((ret = alloc_buffers(avctx, s)) < 0)
53107041
         goto fail;
 
     put_audio_specific_config(avctx);
 
0f4334df
     sizes[0]   = ff_aac_swb_size_1024[s->samplerate_index];
     sizes[1]   = ff_aac_swb_size_128[s->samplerate_index];
     lengths[0] = ff_aac_num_swb_1024[s->samplerate_index];
     lengths[1] = ff_aac_num_swb_128[s->samplerate_index];
53107041
     for (i = 0; i < s->chan_map[0]; i++)
         grouping[i] = s->chan_map[i + 1] == TYPE_CPE;
971099ff
     if ((ret = ff_psy_init(&s->psy, avctx, 2, sizes, lengths,
                            s->chan_map[0], grouping)) < 0)
53107041
         goto fail;
     s->psypp = ff_psy_preprocess_init(avctx);
d09f9c45
     ff_lpc_init(&s->lpc, 2*avctx->frame_size, TNS_MAX_ORDER, FF_LPC_TYPE_LEVINSON);
230178df
     s->random_state = 0x1f2e3d4c;
53107041
 
d2ae5f77
     s->abs_pow34   = abs_pow34_v;
     s->quant_bands = quantize_bands;
 
     if (ARCH_X86)
         ff_aac_dsp_init_x86(s);
 
a27401a0
     if (HAVE_MIPSDSP)
26f3924d
         ff_aac_coder_init_mips(s);
 
6b407551
     if ((ret = ff_thread_once(&aac_table_init, &aac_encode_init_tables)) != 0)
3d62e7a3
         return AVERROR_UNKNOWN;
53107041
 
ad95307f
     ff_af_queue_init(avctx, &s->afq);
 
53107041
     return 0;
 fail:
     aac_encode_end(avctx);
     return ret;
 }
 
cc9947ff
 #define AACENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
 static const AVOption aacenc_options[] = {
6a505e95
     {"aac_coder", "Coding algorithm", offsetof(AACEncContext, options.coder), AV_OPT_TYPE_INT, {.i64 = AAC_CODER_TWOLOOP}, 0, AAC_CODER_NB-1, AACENC_FLAGS, "coder"},
0f4334df
         {"anmr",     "ANMR method",               0, AV_OPT_TYPE_CONST, {.i64 = AAC_CODER_ANMR},    INT_MIN, INT_MAX, AACENC_FLAGS, "coder"},
         {"twoloop",  "Two loop searching method", 0, AV_OPT_TYPE_CONST, {.i64 = AAC_CODER_TWOLOOP}, INT_MIN, INT_MAX, AACENC_FLAGS, "coder"},
         {"fast",     "Constant quantizer",        0, AV_OPT_TYPE_CONST, {.i64 = AAC_CODER_FAST},    INT_MIN, INT_MAX, AACENC_FLAGS, "coder"},
83900c0e
     {"aac_ms", "Force M/S stereo coding", offsetof(AACEncContext, options.mid_side), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, AACENC_FLAGS},
e9299df7
     {"aac_is", "Intensity stereo coding", offsetof(AACEncContext, options.intensity_stereo), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AACENC_FLAGS},
     {"aac_pns", "Perceptual noise substitution", offsetof(AACEncContext, options.pns), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AACENC_FLAGS},
dfba1be9
     {"aac_tns", "Temporal noise shaping", offsetof(AACEncContext, options.tns), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AACENC_FLAGS},
e9299df7
     {"aac_ltp", "Long term prediction", offsetof(AACEncContext, options.ltp), AV_OPT_TYPE_BOOL, {.i64 = 0}, -1, 1, AACENC_FLAGS},
     {"aac_pred", "AAC-Main prediction", offsetof(AACEncContext, options.pred), AV_OPT_TYPE_BOOL, {.i64 = 0}, -1, 1, AACENC_FLAGS},
cc9947ff
     {NULL}
 };
 
 static const AVClass aacenc_class = {
     "AAC encoder",
     av_default_item_name,
     aacenc_options,
     LIBAVUTIL_VERSION_INT,
 };
 
f0a82124
 static const AVCodecDefault aac_encode_defaults[] = {
     { "b", "0" },
     { NULL }
 };
 
e7e2df27
 AVCodec ff_aac_encoder = {
ec6402b7
     .name           = "aac",
b2bed932
     .long_name      = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
ec6402b7
     .type           = AVMEDIA_TYPE_AUDIO,
36ef5369
     .id             = AV_CODEC_ID_AAC,
ec6402b7
     .priv_data_size = sizeof(AACEncContext),
     .init           = aac_encode_init,
ad95307f
     .encode2        = aac_encode_frame,
ec6402b7
     .close          = aac_encode_end,
f0a82124
     .defaults       = aac_encode_defaults,
7581ad24
     .supported_samplerates = mpeg4audio_sample_rates,
3d62e7a3
     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
d9791a86
     .capabilities   = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
f3e2d68d
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
00c3b67b
                                                      AV_SAMPLE_FMT_NONE },
     .priv_class     = &aacenc_class,
c03d9d05
 };