+/*
+ * Copy input samples.
+ * Channels are reordered from Libav's default order to AAC order.
+ */
+static void copy_input_samples(AACEncContext *s, const AVFrame *frame)
+{
+ int ch;
+ int end = 2048 + (frame ? frame->nb_samples : 0);
+ const uint8_t *channel_map = aac_chan_maps[s->channels - 1];
+
+ /* copy and remap input samples */
+ for (ch = 0; ch < s->channels; ch++) {
+ /* copy last 1024 samples of previous frame to the start of the current frame */
+ memcpy(&s->planar_samples[ch][1024], &s->planar_samples[ch][2048], 1024 * sizeof(s->planar_samples[0][0]));
+
+ /* copy new samples and zero any remaining samples */
+ if (frame) {
+ memcpy(&s->planar_samples[ch][2048],
+ frame->extended_data[channel_map[ch]],
+ frame->nb_samples * sizeof(s->planar_samples[0][0]));
+ }
+ memset(&s->planar_samples[ch][end], 0,
+ (3072 - end) * sizeof(s->planar_samples[0][0]));
+ }
+}
+
+static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr)
+{
+ AACEncContext *s = avctx->priv_data;
+ float **samples = s->planar_samples, *samples2, *la, *overlap;
+ ChannelElement *cpe;
+ int i, ch, w, g, chans, tag, start_ch, ret;
+ int chan_el_counter[4];
+ FFPsyWindowInfo windows[AAC_MAX_CHANNELS];
+
+ if (s->last_frame == 2)
+ return 0;
+
+ /* add current frame to queue */
+ if (frame) {
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
+ return ret;
+ }
+
+ copy_input_samples(s, frame);
+ if (s->psypp)
+ ff_psy_preprocess(s->psypp, s->planar_samples, s->channels);
+
+ if (!avctx->frame_number)
+ return 0;
+
+ start_ch = 0;
+ for (i = 0; i < s->chan_map[0]; i++) {
+ FFPsyWindowInfo* wi = windows + start_ch;
+ tag = s->chan_map[i+1];
+ chans = tag == TYPE_CPE ? 2 : 1;
+ cpe = &s->cpe[i];
+ for (ch = 0; ch < chans; ch++) {
+ IndividualChannelStream *ics = &cpe->ch[ch].ics;
+ int cur_channel = start_ch + ch;
+ overlap = &samples[cur_channel][0];
+ samples2 = overlap + 1024;
+ la = samples2 + (448+64);
+ if (!frame)
+ la = NULL;
+ if (tag == TYPE_LFE) {
+ wi[ch].window_type[0] = ONLY_LONG_SEQUENCE;
+ wi[ch].window_shape = 0;
+ wi[ch].num_windows = 1;
+ wi[ch].grouping[0] = 1;
+
+ /* 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;
+ } else {
+ wi[ch] = s->psy.model->window(&s->psy, samples2, la, cur_channel,
+ ics->window_sequence[0]);
+ }
+ ics->window_sequence[1] = ics->window_sequence[0];
+ ics->window_sequence[0] = wi[ch].window_type[0];
+ ics->use_kb_window[1] = ics->use_kb_window[0];
+ ics->use_kb_window[0] = wi[ch].window_shape;
+ ics->num_windows = wi[ch].num_windows;
+ ics->swb_sizes = s->psy.bands [ics->num_windows == 8];
+ ics->num_swb = tag == TYPE_LFE ? ics->num_swb : s->psy.num_bands[ics->num_windows == 8];
+ for (w = 0; w < ics->num_windows; w++)
+ ics->group_len[w] = wi[ch].grouping[w];
+
+ apply_window_and_mdct(s, &cpe->ch[ch], overlap);
+ }
+ start_ch += chans;
+ }
+ if ((ret = ff_alloc_packet(avpkt, 768 * s->channels))) {
+ av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
+ return ret;
+ }
+
+ do {
+ int frame_bits;
+
+ init_put_bits(&s->pb, avpkt->data, avpkt->size);
+
+ if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT))
+ put_bitstream_info(s, LIBAVCODEC_IDENT);
+ start_ch = 0;
+ memset(chan_el_counter, 0, sizeof(chan_el_counter));
+ for (i = 0; i < s->chan_map[0]; i++) {
+ FFPsyWindowInfo* wi = windows + start_ch;
+ const float *coeffs[2];
+ tag = s->chan_map[i+1];
+ chans = tag == TYPE_CPE ? 2 : 1;
+ cpe = &s->cpe[i];
+ put_bits(&s->pb, 3, tag);
+ put_bits(&s->pb, 4, chan_el_counter[tag]++);
+ for (ch = 0; ch < chans; ch++)
+ coeffs[ch] = cpe->ch[ch].coeffs;
+ s->psy.model->analyze(&s->psy, start_ch, coeffs, wi);
+ for (ch = 0; ch < chans; ch++) {
+ s->cur_channel = start_ch + ch;
+ s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda);
+ }
+ cpe->common_window = 0;
+ 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;
+ for (w = 0; w < wi[0].num_windows; w++) {
+ if (wi[0].grouping[w] != wi[1].grouping[w]) {
+ cpe->common_window = 0;
+ break;
+ }
+ }
+ }
+ s->cur_channel = start_ch;
+ if (s->options.stereo_mode && cpe->common_window) {
+ if (s->options.stereo_mode > 0) {
+ IndividualChannelStream *ics = &cpe->ch[0].ics;
+ for (w = 0; w < ics->num_windows; w += ics->group_len[w])
+ for (g = 0; g < ics->num_swb; g++)
+ cpe->ms_mask[w*16+g] = 1;
+ } else if (s->coder->search_for_ms) {
+ s->coder->search_for_ms(s, cpe, s->lambda);
+ }
+ }
+ adjust_frame_information(cpe, chans);
+ if (chans == 2) {
+ put_bits(&s->pb, 1, cpe->common_window);
+ if (cpe->common_window) {
+ put_ics_info(s, &cpe->ch[0].ics);
+ encode_ms_info(&s->pb, cpe);
+ }
+ }
+ for (ch = 0; ch < chans; ch++) {
+ s->cur_channel = start_ch + ch;
+ encode_individual_channel(avctx, s, &cpe->ch[ch], cpe->common_window);
+ }
+ start_ch += chans;
+ }
+
+ frame_bits = put_bits_count(&s->pb);
+ if (frame_bits <= 6144 * s->channels - 3) {
+ s->psy.bitres.bits = frame_bits / s->channels;
+ break;
+ }
+
+ s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits;
+
+ } while (1);
+
+ put_bits(&s->pb, 3, TYPE_END);
+ flush_put_bits(&s->pb);
+ avctx->frame_bits = put_bits_count(&s->pb);
+
+ // rate control stuff
+ if (!(avctx->flags & CODEC_FLAG_QSCALE)) {
+ float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits;
+ s->lambda *= ratio;
+ s->lambda = FFMIN(s->lambda, 65536.f);
+ }
+
+ if (!frame)
+ s->last_frame++;
+
+ 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;
+}
+