aacenc.c
Go to the documentation of this file.
1 /*
2  * AAC encoder
3  * Copyright (C) 2008 Konstantin Shishkov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * AAC encoder
25  */
26 
27 /***********************************
28  * TODOs:
29  * add sane pulse detection
30  * add temporal noise shaping
31  ***********************************/
32 
33 #include "libavutil/float_dsp.h"
34 #include "libavutil/opt.h"
35 #include "avcodec.h"
36 #include "put_bits.h"
37 #include "internal.h"
38 #include "mpeg4audio.h"
39 #include "kbdwin.h"
40 #include "sinewin.h"
41 
42 #include "aac.h"
43 #include "aactab.h"
44 #include "aacenc.h"
45 
46 #include "psymodel.h"
47 
48 #define AAC_MAX_CHANNELS 6
49 
50 #define ERROR_IF(cond, ...) \
51  if (cond) { \
52  av_log(avctx, AV_LOG_ERROR, __VA_ARGS__); \
53  return AVERROR(EINVAL); \
54  }
55 
56 float ff_aac_pow34sf_tab[428];
57 
58 static const uint8_t swb_size_1024_96[] = {
59  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,
60  12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44,
61  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
62 };
63 
64 static const uint8_t swb_size_1024_64[] = {
65  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8,
66  12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36,
67  40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40
68 };
69 
70 static const uint8_t swb_size_1024_48[] = {
71  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8,
72  12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28,
73  32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
74  96
75 };
76 
77 static const uint8_t swb_size_1024_32[] = {
78  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8,
79  12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28,
80  32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
81 };
82 
83 static const uint8_t swb_size_1024_24[] = {
84  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
85  12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28,
86  32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64
87 };
88 
89 static const uint8_t swb_size_1024_16[] = {
90  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
91  12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28,
92  32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64
93 };
94 
95 static const uint8_t swb_size_1024_8[] = {
96  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
97  16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28,
98  32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80
99 };
100 
101 static const uint8_t *swb_size_1024[] = {
106 };
107 
108 static const uint8_t swb_size_128_96[] = {
109  4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36
110 };
111 
112 static const uint8_t swb_size_128_48[] = {
113  4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16
114 };
115 
116 static const uint8_t swb_size_128_24[] = {
117  4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20
118 };
119 
120 static const uint8_t swb_size_128_16[] = {
121  4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20
122 };
123 
124 static const uint8_t swb_size_128_8[] = {
125  4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20
126 };
127 
128 static const uint8_t *swb_size_128[] = {
129  /* the last entry on the following row is swb_size_128_64 but is a
130  duplicate of swb_size_128_96 */
135 };
136 
137 /** default channel configurations */
138 static const uint8_t aac_chan_configs[6][5] = {
139  {1, TYPE_SCE}, // 1 channel - single channel element
140  {1, TYPE_CPE}, // 2 channels - channel pair
141  {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo
142  {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center
143  {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo
144  {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE
145 };
146 
147 /**
148  * Table to remap channels from libavcodec's default order to AAC order.
149  */
151  { 0 },
152  { 0, 1 },
153  { 2, 0, 1 },
154  { 2, 0, 1, 3 },
155  { 2, 0, 1, 3, 4 },
156  { 2, 0, 1, 4, 5, 3 },
157 };
158 
159 /**
160  * Make AAC audio config object.
161  * @see 1.6.2.1 "Syntax - AudioSpecificConfig"
162  */
164 {
165  PutBitContext pb;
166  AACEncContext *s = avctx->priv_data;
167 
168  init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8);
169  put_bits(&pb, 5, 2); //object type - AAC-LC
170  put_bits(&pb, 4, s->samplerate_index); //sample rate index
171  put_bits(&pb, 4, s->channels);
172  //GASpecificConfig
173  put_bits(&pb, 1, 0); //frame length - 1024 samples
174  put_bits(&pb, 1, 0); //does not depend on core coder
175  put_bits(&pb, 1, 0); //is not extension
176 
177  //Explicitly Mark SBR absent
178  put_bits(&pb, 11, 0x2b7); //sync extension
179  put_bits(&pb, 5, AOT_SBR);
180  put_bits(&pb, 1, 0);
181  flush_put_bits(&pb);
182 }
183 
184 #define WINDOW_FUNC(type) \
185 static void apply_ ##type ##_window(AVFloatDSPContext *fdsp, \
186  SingleChannelElement *sce, \
187  const float *audio)
188 
189 WINDOW_FUNC(only_long)
190 {
191  const float *lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024;
192  const float *pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024;
193  float *out = sce->ret_buf;
194 
195  fdsp->vector_fmul (out, audio, lwindow, 1024);
196  fdsp->vector_fmul_reverse(out + 1024, audio + 1024, pwindow, 1024);
197 }
198 
199 WINDOW_FUNC(long_start)
200 {
201  const float *lwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024;
202  const float *swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
203  float *out = sce->ret_buf;
204 
205  fdsp->vector_fmul(out, audio, lwindow, 1024);
206  memcpy(out + 1024, audio + 1024, sizeof(out[0]) * 448);
207  fdsp->vector_fmul_reverse(out + 1024 + 448, audio + 1024 + 448, swindow, 128);
208  memset(out + 1024 + 576, 0, sizeof(out[0]) * 448);
209 }
210 
211 WINDOW_FUNC(long_stop)
212 {
213  const float *lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024;
214  const float *swindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
215  float *out = sce->ret_buf;
216 
217  memset(out, 0, sizeof(out[0]) * 448);
218  fdsp->vector_fmul(out + 448, audio + 448, swindow, 128);
219  memcpy(out + 576, audio + 576, sizeof(out[0]) * 448);
220  fdsp->vector_fmul_reverse(out + 1024, audio + 1024, lwindow, 1024);
221 }
222 
223 WINDOW_FUNC(eight_short)
224 {
225  const float *swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
226  const float *pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
227  const float *in = audio + 448;
228  float *out = sce->ret_buf;
229  int w;
230 
231  for (w = 0; w < 8; w++) {
232  fdsp->vector_fmul (out, in, w ? pwindow : swindow, 128);
233  out += 128;
234  in += 128;
235  fdsp->vector_fmul_reverse(out, in, swindow, 128);
236  out += 128;
237  }
238 }
239 
240 static void (*const apply_window[4])(AVFloatDSPContext *fdsp,
242  const float *audio) = {
243  [ONLY_LONG_SEQUENCE] = apply_only_long_window,
244  [LONG_START_SEQUENCE] = apply_long_start_window,
245  [EIGHT_SHORT_SEQUENCE] = apply_eight_short_window,
246  [LONG_STOP_SEQUENCE] = apply_long_stop_window
247 };
248 
250  float *audio)
251 {
252  int i;
253  float *output = sce->ret_buf;
254 
255  apply_window[sce->ics.window_sequence[0]](&s->fdsp, sce, audio);
256 
258  s->mdct1024.mdct_calc(&s->mdct1024, sce->coeffs, output);
259  else
260  for (i = 0; i < 1024; i += 128)
261  s->mdct128.mdct_calc(&s->mdct128, sce->coeffs + i, output + i*2);
262  memcpy(audio, audio + 1024, sizeof(audio[0]) * 1024);
263 }
264 
265 /**
266  * Encode ics_info element.
267  * @see Table 4.6 (syntax of ics_info)
268  */
270 {
271  int w;
272 
273  put_bits(&s->pb, 1, 0); // ics_reserved bit
274  put_bits(&s->pb, 2, info->window_sequence[0]);
275  put_bits(&s->pb, 1, info->use_kb_window[0]);
276  if (info->window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
277  put_bits(&s->pb, 6, info->max_sfb);
278  put_bits(&s->pb, 1, 0); // no prediction
279  } else {
280  put_bits(&s->pb, 4, info->max_sfb);
281  for (w = 1; w < 8; w++)
282  put_bits(&s->pb, 1, !info->group_len[w]);
283  }
284 }
285 
286 /**
287  * Encode MS data.
288  * @see 4.6.8.1 "Joint Coding - M/S Stereo"
289  */
291 {
292  int i, w;
293 
294  put_bits(pb, 2, cpe->ms_mode);
295  if (cpe->ms_mode == 1)
296  for (w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w])
297  for (i = 0; i < cpe->ch[0].ics.max_sfb; i++)
298  put_bits(pb, 1, cpe->ms_mask[w*16 + i]);
299 }
300 
301 /**
302  * Produce integer coefficients from scalefactors provided by the model.
303  */
304 static void adjust_frame_information(ChannelElement *cpe, int chans)
305 {
306  int i, w, w2, g, ch;
307  int start, maxsfb, cmaxsfb;
308 
309  for (ch = 0; ch < chans; ch++) {
310  IndividualChannelStream *ics = &cpe->ch[ch].ics;
311  start = 0;
312  maxsfb = 0;
313  cpe->ch[ch].pulse.num_pulse = 0;
314  for (w = 0; w < ics->num_windows*16; w += 16) {
315  for (g = 0; g < ics->num_swb; g++) {
316  //apply M/S
317  if (cpe->common_window && !ch && cpe->ms_mask[w + g]) {
318  for (i = 0; i < ics->swb_sizes[g]; i++) {
319  cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0;
320  cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];
321  }
322  }
323  start += ics->swb_sizes[g];
324  }
325  for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--)
326  ;
327  maxsfb = FFMAX(maxsfb, cmaxsfb);
328  }
329  ics->max_sfb = maxsfb;
330 
331  //adjust zero bands for window groups
332  for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
333  for (g = 0; g < ics->max_sfb; g++) {
334  i = 1;
335  for (w2 = w; w2 < w + ics->group_len[w]; w2++) {
336  if (!cpe->ch[ch].zeroes[w2*16 + g]) {
337  i = 0;
338  break;
339  }
340  }
341  cpe->ch[ch].zeroes[w*16 + g] = i;
342  }
343  }
344  }
345 
346  if (chans > 1 && cpe->common_window) {
347  IndividualChannelStream *ics0 = &cpe->ch[0].ics;
348  IndividualChannelStream *ics1 = &cpe->ch[1].ics;
349  int msc = 0;
350  ics0->max_sfb = FFMAX(ics0->max_sfb, ics1->max_sfb);
351  ics1->max_sfb = ics0->max_sfb;
352  for (w = 0; w < ics0->num_windows*16; w += 16)
353  for (i = 0; i < ics0->max_sfb; i++)
354  if (cpe->ms_mask[w+i])
355  msc++;
356  if (msc == 0 || ics0->max_sfb == 0)
357  cpe->ms_mode = 0;
358  else
359  cpe->ms_mode = msc < ics0->max_sfb * ics0->num_windows ? 1 : 2;
360  }
361 }
362 
363 /**
364  * Encode scalefactor band coding type.
365  */
367 {
368  int w;
369 
370  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
371  s->coder->encode_window_bands_info(s, sce, w, sce->ics.group_len[w], s->lambda);
372 }
373 
374 /**
375  * Encode scalefactors.
376  */
379 {
380  int off = sce->sf_idx[0], diff;
381  int i, w;
382 
383  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
384  for (i = 0; i < sce->ics.max_sfb; i++) {
385  if (!sce->zeroes[w*16 + i]) {
386  diff = sce->sf_idx[w*16 + i] - off + SCALE_DIFF_ZERO;
387  av_assert0(diff >= 0 && diff <= 120);
388  off = sce->sf_idx[w*16 + i];
390  }
391  }
392  }
393 }
394 
395 /**
396  * Encode pulse data.
397  */
398 static void encode_pulses(AACEncContext *s, Pulse *pulse)
399 {
400  int i;
401 
402  put_bits(&s->pb, 1, !!pulse->num_pulse);
403  if (!pulse->num_pulse)
404  return;
405 
406  put_bits(&s->pb, 2, pulse->num_pulse - 1);
407  put_bits(&s->pb, 6, pulse->start);
408  for (i = 0; i < pulse->num_pulse; i++) {
409  put_bits(&s->pb, 5, pulse->pos[i]);
410  put_bits(&s->pb, 4, pulse->amp[i]);
411  }
412 }
413 
414 /**
415  * Encode spectral coefficients processed by psychoacoustic model.
416  */
418 {
419  int start, i, w, w2;
420 
421  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
422  start = 0;
423  for (i = 0; i < sce->ics.max_sfb; i++) {
424  if (sce->zeroes[w*16 + i]) {
425  start += sce->ics.swb_sizes[i];
426  continue;
427  }
428  for (w2 = w; w2 < w + sce->ics.group_len[w]; w2++)
429  s->coder->quantize_and_encode_band(s, &s->pb, sce->coeffs + start + w2*128,
430  sce->ics.swb_sizes[i],
431  sce->sf_idx[w*16 + i],
432  sce->band_type[w*16 + i],
433  s->lambda);
434  start += sce->ics.swb_sizes[i];
435  }
436  }
437 }
438 
439 /**
440  * Encode one channel of audio data.
441  */
444  int common_window)
445 {
446  put_bits(&s->pb, 8, sce->sf_idx[0]);
447  if (!common_window)
448  put_ics_info(s, &sce->ics);
449  encode_band_info(s, sce);
450  encode_scale_factors(avctx, s, sce);
451  encode_pulses(s, &sce->pulse);
452  put_bits(&s->pb, 1, 0); //tns
453  put_bits(&s->pb, 1, 0); //ssr
454  encode_spectral_coeffs(s, sce);
455  return 0;
456 }
457 
458 /**
459  * Write some auxiliary information about the created AAC file.
460  */
461 static void put_bitstream_info(AACEncContext *s, const char *name)
462 {
463  int i, namelen, padbits;
464 
465  namelen = strlen(name) + 2;
466  put_bits(&s->pb, 3, TYPE_FIL);
467  put_bits(&s->pb, 4, FFMIN(namelen, 15));
468  if (namelen >= 15)
469  put_bits(&s->pb, 8, namelen - 14);
470  put_bits(&s->pb, 4, 0); //extension type - filler
471  padbits = -put_bits_count(&s->pb) & 7;
473  for (i = 0; i < namelen - 2; i++)
474  put_bits(&s->pb, 8, name[i]);
475  put_bits(&s->pb, 12 - padbits, 0);
476 }
477 
478 /*
479  * Copy input samples.
480  * Channels are reordered from libavcodec's default order to AAC order.
481  */
483 {
484  int ch;
485  int end = 2048 + (frame ? frame->nb_samples : 0);
486  const uint8_t *channel_map = aac_chan_maps[s->channels - 1];
487 
488  /* copy and remap input samples */
489  for (ch = 0; ch < s->channels; ch++) {
490  /* copy last 1024 samples of previous frame to the start of the current frame */
491  memcpy(&s->planar_samples[ch][1024], &s->planar_samples[ch][2048], 1024 * sizeof(s->planar_samples[0][0]));
492 
493  /* copy new samples and zero any remaining samples */
494  if (frame) {
495  memcpy(&s->planar_samples[ch][2048],
496  frame->extended_data[channel_map[ch]],
497  frame->nb_samples * sizeof(s->planar_samples[0][0]));
498  }
499  memset(&s->planar_samples[ch][end], 0,
500  (3072 - end) * sizeof(s->planar_samples[0][0]));
501  }
502 }
503 
504 static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
505  const AVFrame *frame, int *got_packet_ptr)
506 {
507  AACEncContext *s = avctx->priv_data;
508  float **samples = s->planar_samples, *samples2, *la, *overlap;
509  ChannelElement *cpe;
510  int i, ch, w, g, chans, tag, start_ch, ret;
511  int chan_el_counter[4];
513 
514  if (s->last_frame == 2)
515  return 0;
516 
517  /* add current frame to queue */
518  if (frame) {
519  if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
520  return ret;
521  }
522 
523  copy_input_samples(s, frame);
524  if (s->psypp)
526 
527  if (!avctx->frame_number)
528  return 0;
529 
530  start_ch = 0;
531  for (i = 0; i < s->chan_map[0]; i++) {
532  FFPsyWindowInfo* wi = windows + start_ch;
533  tag = s->chan_map[i+1];
534  chans = tag == TYPE_CPE ? 2 : 1;
535  cpe = &s->cpe[i];
536  for (ch = 0; ch < chans; ch++) {
537  IndividualChannelStream *ics = &cpe->ch[ch].ics;
538  int cur_channel = start_ch + ch;
539  overlap = &samples[cur_channel][0];
540  samples2 = overlap + 1024;
541  la = samples2 + (448+64);
542  if (!frame)
543  la = NULL;
544  if (tag == TYPE_LFE) {
545  wi[ch].window_type[0] = ONLY_LONG_SEQUENCE;
546  wi[ch].window_shape = 0;
547  wi[ch].num_windows = 1;
548  wi[ch].grouping[0] = 1;
549 
550  /* Only the lowest 12 coefficients are used in a LFE channel.
551  * The expression below results in only the bottom 8 coefficients
552  * being used for 11.025kHz to 16kHz sample rates.
553  */
554  ics->num_swb = s->samplerate_index >= 8 ? 1 : 3;
555  } else {
556  wi[ch] = s->psy.model->window(&s->psy, samples2, la, cur_channel,
557  ics->window_sequence[0]);
558  }
559  ics->window_sequence[1] = ics->window_sequence[0];
560  ics->window_sequence[0] = wi[ch].window_type[0];
561  ics->use_kb_window[1] = ics->use_kb_window[0];
562  ics->use_kb_window[0] = wi[ch].window_shape;
563  ics->num_windows = wi[ch].num_windows;
564  ics->swb_sizes = s->psy.bands [ics->num_windows == 8];
565  ics->num_swb = tag == TYPE_LFE ? ics->num_swb : s->psy.num_bands[ics->num_windows == 8];
566  for (w = 0; w < ics->num_windows; w++)
567  ics->group_len[w] = wi[ch].grouping[w];
568 
569  apply_window_and_mdct(s, &cpe->ch[ch], overlap);
570  }
571  start_ch += chans;
572  }
573  if ((ret = ff_alloc_packet2(avctx, avpkt, 8192 * s->channels)) < 0)
574  return ret;
575  do {
576  int frame_bits;
577 
578  init_put_bits(&s->pb, avpkt->data, avpkt->size);
579 
580  if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT))
582  start_ch = 0;
583  memset(chan_el_counter, 0, sizeof(chan_el_counter));
584  for (i = 0; i < s->chan_map[0]; i++) {
585  FFPsyWindowInfo* wi = windows + start_ch;
586  const float *coeffs[2];
587  tag = s->chan_map[i+1];
588  chans = tag == TYPE_CPE ? 2 : 1;
589  cpe = &s->cpe[i];
590  put_bits(&s->pb, 3, tag);
591  put_bits(&s->pb, 4, chan_el_counter[tag]++);
592  for (ch = 0; ch < chans; ch++)
593  coeffs[ch] = cpe->ch[ch].coeffs;
594  s->psy.model->analyze(&s->psy, start_ch, coeffs, wi);
595  for (ch = 0; ch < chans; ch++) {
596  s->cur_channel = start_ch * 2 + ch;
597  s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda);
598  }
599  cpe->common_window = 0;
600  if (chans > 1
601  && wi[0].window_type[0] == wi[1].window_type[0]
602  && wi[0].window_shape == wi[1].window_shape) {
603 
604  cpe->common_window = 1;
605  for (w = 0; w < wi[0].num_windows; w++) {
606  if (wi[0].grouping[w] != wi[1].grouping[w]) {
607  cpe->common_window = 0;
608  break;
609  }
610  }
611  }
612  s->cur_channel = start_ch * 2;
613  if (s->options.stereo_mode && cpe->common_window) {
614  if (s->options.stereo_mode > 0) {
615  IndividualChannelStream *ics = &cpe->ch[0].ics;
616  for (w = 0; w < ics->num_windows; w += ics->group_len[w])
617  for (g = 0; g < ics->num_swb; g++)
618  cpe->ms_mask[w*16+g] = 1;
619  } else if (s->coder->search_for_ms) {
620  s->coder->search_for_ms(s, cpe, s->lambda);
621  }
622  }
623  adjust_frame_information(cpe, chans);
624  if (chans == 2) {
625  put_bits(&s->pb, 1, cpe->common_window);
626  if (cpe->common_window) {
627  put_ics_info(s, &cpe->ch[0].ics);
628  encode_ms_info(&s->pb, cpe);
629  }
630  }
631  for (ch = 0; ch < chans; ch++) {
632  s->cur_channel = start_ch + ch;
633  encode_individual_channel(avctx, s, &cpe->ch[ch], cpe->common_window);
634  }
635  start_ch += chans;
636  }
637 
638  frame_bits = put_bits_count(&s->pb);
639  if (frame_bits <= 6144 * s->channels - 3) {
640  s->psy.bitres.bits = frame_bits / s->channels;
641  break;
642  }
643 
644  s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits;
645 
646  } while (1);
647 
648  put_bits(&s->pb, 3, TYPE_END);
649  flush_put_bits(&s->pb);
650  avctx->frame_bits = put_bits_count(&s->pb);
651 
652  // rate control stuff
653  if (!(avctx->flags & CODEC_FLAG_QSCALE)) {
654  float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits;
655  s->lambda *= ratio;
656  s->lambda = FFMIN(s->lambda, 65536.f);
657  }
658 
659  if (!frame)
660  s->last_frame++;
661 
662  ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
663  &avpkt->duration);
664 
665  avpkt->size = put_bits_count(&s->pb) >> 3;
666  *got_packet_ptr = 1;
667  return 0;
668 }
669 
671 {
672  AACEncContext *s = avctx->priv_data;
673 
674  ff_mdct_end(&s->mdct1024);
675  ff_mdct_end(&s->mdct128);
676  ff_psy_end(&s->psy);
677  if (s->psypp)
679  av_freep(&s->buffer.samples);
680  av_freep(&s->cpe);
681  ff_af_queue_close(&s->afq);
682  return 0;
683 }
684 
686 {
687  int ret = 0;
688 
690 
691  // window init
692  ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
693  ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
696 
697  if (ret = ff_mdct_init(&s->mdct1024, 11, 0, 32768.0))
698  return ret;
699  if (ret = ff_mdct_init(&s->mdct128, 8, 0, 32768.0))
700  return ret;
701 
702  return 0;
703 }
704 
706 {
707  int ch;
708  FF_ALLOCZ_OR_GOTO(avctx, s->buffer.samples, 3 * 1024 * s->channels * sizeof(s->buffer.samples[0]), alloc_fail);
709  FF_ALLOCZ_OR_GOTO(avctx, s->cpe, sizeof(ChannelElement) * s->chan_map[0], alloc_fail);
710  FF_ALLOCZ_OR_GOTO(avctx, avctx->extradata, 5 + FF_INPUT_BUFFER_PADDING_SIZE, alloc_fail);
711 
712  for(ch = 0; ch < s->channels; ch++)
713  s->planar_samples[ch] = s->buffer.samples + 3 * 1024 * ch;
714 
715  return 0;
716 alloc_fail:
717  return AVERROR(ENOMEM);
718 }
719 
721 {
722  AACEncContext *s = avctx->priv_data;
723  int i, ret = 0;
724  const uint8_t *sizes[2];
725  uint8_t grouping[AAC_MAX_CHANNELS];
726  int lengths[2];
727 
728  avctx->frame_size = 1024;
729 
730  for (i = 0; i < 16; i++)
732  break;
733 
734  s->channels = avctx->channels;
735 
736  ERROR_IF(i == 16,
737  "Unsupported sample rate %d\n", avctx->sample_rate);
739  "Unsupported number of channels: %d\n", s->channels);
741  "Unsupported profile %d\n", avctx->profile);
742  ERROR_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels,
743  "Too many bits per frame requested\n");
744 
745  s->samplerate_index = i;
746 
748 
749  if (ret = dsp_init(avctx, s))
750  goto fail;
751 
752  if (ret = alloc_buffers(avctx, s))
753  goto fail;
754 
755  avctx->extradata_size = 5;
757 
758  sizes[0] = swb_size_1024[i];
759  sizes[1] = swb_size_128[i];
760  lengths[0] = ff_aac_num_swb_1024[i];
761  lengths[1] = ff_aac_num_swb_128[i];
762  for (i = 0; i < s->chan_map[0]; i++)
763  grouping[i] = s->chan_map[i + 1] == TYPE_CPE;
764  if (ret = ff_psy_init(&s->psy, avctx, 2, sizes, lengths, s->chan_map[0], grouping))
765  goto fail;
766  s->psypp = ff_psy_preprocess_init(avctx);
768 
769  if (HAVE_MIPSDSPR1)
771 
772  s->lambda = avctx->global_quality ? avctx->global_quality : 120;
773 
775 
776  for (i = 0; i < 428; i++)
778 
779  avctx->delay = 1024;
780  ff_af_queue_init(avctx, &s->afq);
781 
782  return 0;
783 fail:
784  aac_encode_end(avctx);
785  return ret;
786 }
787 
788 #define AACENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
789 static const AVOption aacenc_options[] = {
790  {"stereo_mode", "Stereo coding method", offsetof(AACEncContext, options.stereo_mode), AV_OPT_TYPE_INT, {.i64 = 0}, -1, 1, AACENC_FLAGS, "stereo_mode"},
791  {"auto", "Selected by the Encoder", 0, AV_OPT_TYPE_CONST, {.i64 = -1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
792  {"ms_off", "Disable Mid/Side coding", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
793  {"ms_force", "Force Mid/Side for the whole frame if possible", 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
794  {"aac_coder", "", offsetof(AACEncContext, options.aac_coder), AV_OPT_TYPE_INT, {.i64 = 2}, 0, AAC_CODER_NB-1, AACENC_FLAGS},
795  {NULL}
796 };
797 
798 static const AVClass aacenc_class = {
799  "AAC encoder",
803 };
804 
805 /* duplicated from avpriv_mpeg4audio_sample_rates to avoid shared build
806  * failures */
807 static const int mpeg4audio_sample_rates[16] = {
808  96000, 88200, 64000, 48000, 44100, 32000,
809  24000, 22050, 16000, 12000, 11025, 8000, 7350
810 };
811 
813  .name = "aac",
814  .type = AVMEDIA_TYPE_AUDIO,
815  .id = AV_CODEC_ID_AAC,
816  .priv_data_size = sizeof(AACEncContext),
818  .encode2 = aac_encode_frame,
821  .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY |
823  .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
825  .long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
826  .priv_class = &aacenc_class,
827 };
const char * name
Definition: avisynth_c.h:675
static const uint8_t aac_chan_configs[6][5]
default channel configurations
Definition: aacenc.c:138
const char * s
Definition: avisynth_c.h:668
uint8_t use_kb_window[2]
If set, use Kaiser-Bessel window, otherwise use a sinus window.
Definition: aac.h:160
AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB]
Definition: aaccoder.c:1115
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static const uint8_t swb_size_1024_64[]
Definition: aacenc.c:64
int grouping[8]
window grouping (for e.g. AAC)
Definition: psymodel.h:69
AVOption.
Definition: opt.h:251
uint8_t ** bands
scalefactor band sizes for possible frame sizes
Definition: psymodel.h:84
Definition: aac.h:203
av_default_item_name
static const AVClass aacenc_class
Definition: aacenc.c:798
av_cold void ff_kbd_window_init(float *window, float alpha, int n)
Generate a Kaiser-Bessel Derived Window.
Definition: kbdwin.c:26
#define SCALE_DIFF_ZERO
codebook index corresponding to zero scalefactor indices difference
Definition: aac.h:142
Definition: aac.h:56
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
struct FFPsyContext::@82 bitres
Definition: aac.h:49
Definition: aac.h:50
av_cold void ff_psy_preprocess_end(struct FFPsyPreprocessContext *ctx)
Cleanup audio preprocessing module.
Definition: psymodel.c:138
AACCoefficientsEncoder * coder
Definition: aacenc.h:73
void avpriv_align_put_bits(PutBitContext *s)
Pad the bitstream with zeros up to the next byte boundary.
Definition: bitstream.c:46
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
static void put_ics_info(AACEncContext *s, IndividualChannelStream *info)
Encode ics_info element.
Definition: aacenc.c:269
void(* search_for_ms)(struct AACEncContext *s, ChannelElement *cpe, const float lambda)
Definition: aacenc.h:49
#define AAC_MAX_CHANNELS
Definition: aacenc.c:48
int common_window
Set if channels share a common &#39;IndividualChannelStream&#39; in bitstream.
Definition: aac.h:249
av_cold int ff_psy_init(FFPsyContext *ctx, AVCodecContext *avctx, int num_lens, const uint8_t **bands, const int *num_bands, int num_groups, const uint8_t *group_map)
Initialize psychoacoustic model.
Definition: psymodel.c:31
uint8_t ms_mask[128]
Set if mid/side stereo is used for each scalefactor window band.
Definition: aac.h:251
static const uint8_t swb_size_128_8[]
Definition: aacenc.c:124
float lambda
Definition: aacenc.h:76
static const uint8_t swb_size_1024_8[]
Definition: aacenc.c:95
static const uint8_t swb_size_128_96[]
Definition: aacenc.c:108
static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce)
Encode spectral coefficients processed by psychoacoustic model.
Definition: aacenc.c:417
int * num_bands
number of scalefactor bands for possible frame sizes
Definition: psymodel.h:85
output residual component w
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
const uint8_t ff_aac_num_swb_128[]
Definition: aactab.c:43
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
void(* search_for_quantizers)(AVCodecContext *avctx, struct AACEncContext *s, SingleChannelElement *sce, const float lambda)
Definition: aacenc.h:43
static const int mpeg4audio_sample_rates[16]
Definition: aacenc.c:807
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
supported_samplerates
AACEncOptions options
encoding options
Definition: aacenc.h:59
AAC encoder context.
Definition: aacenc.h:57
uint8_t
#define av_cold
Definition: attributes.h:78
AVOptions.
#define WINDOW_FUNC(type)
Definition: aacenc.c:184
void ff_aac_coder_init_mips(AACEncContext *c)
SingleChannelElement ch[2]
Definition: aac.h:253
int samplerate_index
MPEG-4 samplerate index.
Definition: aacenc.h:66
Definition: aac.h:52
const uint8_t * chan_map
channel configuration map
Definition: aacenc.h:68
end end
#define FF_PROFILE_UNKNOWN
const uint8_t ff_aac_scalefactor_bits[121]
Definition: aactab.c:70
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
AudioFrameQueue afq
Definition: aacenc.h:77
static const uint8_t swb_size_1024_48[]
Definition: aacenc.c:70
uint8_t * data
uint32_t tag
Definition: movenc.c:894
AVFloatDSPContext fdsp
Definition: aacenc.h:63
integer sqrt
Definition: avutil.txt:2
#define CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
const OptionDef options[]
Definition: ffserver.c:4697
static void adjust_frame_information(ChannelElement *cpe, int chans)
Produce integer coefficients from scalefactors provided by the model.
Definition: aacenc.c:304
float, planar
Definition: samplefmt.h:60
static const AVOption aacenc_options[]
Definition: aacenc.c:789
frame
Definition: stft.m:14
static const uint8_t swb_size_1024_24[]
Definition: aacenc.c:83
#define CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
static const int sizes[][2]
Definition: img2dec.c:68
const uint8_t ff_aac_num_swb_1024[]
Definition: aactab.c:39
int last_frame
Definition: aacenc.h:75
#define CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void(* quantize_and_encode_band)(struct AACEncContext *s, PutBitContext *pb, const float *in, int size, int scale_idx, int cb, const float lambda)
Definition: aacenc.h:47
int stereo_mode
Definition: aacenc.h:36
int flags
CODEC_FLAG_*.
void(* mdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input)
Definition: fft.h:83
int amp[4]
Definition: aac.h:207
#define CODEC_FLAG_QSCALE
Use fixed qscale.
const char * name
Name of the codec implementation.
int num_windows
number of windows in a frame
Definition: psymodel.h:68
static void copy_input_samples(AACEncContext *s, const AVFrame *frame)
Definition: aacenc.c:482
uint8_t max_sfb
number of scalefactor bands per group
Definition: aac.h:158
#define ff_mdct_init
Definition: fft.h:147
Definition: aac.h:55
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:160
int num_swb
number of scalefactor window bands
Definition: aac.h:166
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
#define FFMAX(a, b)
Definition: common.h:56
external API header
static int put_bits_count(PutBitContext *s)
Definition: put_bits.h:73
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
#define AACENC_FLAGS
Definition: aacenc.c:788
struct AACEncContext AACEncContext
AAC encoder context.
MIPS optimizations info
Definition: mips.txt:2
FFT buffer for g
Definition: stft_peak.m:17
int bit_rate
the average bitrate
enum WindowSequence window_sequence[2]
Definition: aac.h:159
int cur_channel
Definition: aacenc.h:74
#define FFMIN(a, b)
Definition: common.h:58
static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition: aacenc.c:504
ret
Definition: avfilter.c:821
static const uint8_t aac_chan_maps[AAC_MAX_CHANNELS][AAC_MAX_CHANNELS]
Table to remap channels from libavcodec&#39;s default order to AAC order.
Definition: aacenc.c:150
int pos[4]
Definition: aac.h:206
int channels
channel count
Definition: aacenc.h:67
AAC definitions and structures.
#define diff(a, as, b, bs)
Definition: vf_phase.c:80
FFTContext mdct128
short (128 samples) frame transform context
Definition: aacenc.h:62
PutBitContext pb
Definition: aacenc.h:60
static void(*const apply_window[4])(AVFloatDSPContext *fdsp, SingleChannelElement *sce, const float *audio)
Definition: aacenc.c:240
float ff_aac_pow34sf_tab[428]
Definition: aacenc.c:56
static const uint8_t swb_size_128_48[]
Definition: aacenc.c:112
static const uint8_t swb_size_128_24[]
Definition: aacenc.c:116
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
static const uint8_t swb_size_1024_16[]
Definition: aacenc.c:89
static av_cold int aac_encode_end(AVCodecContext *avctx)
Definition: aacenc.c:670
int frame_size
Number of samples per channel in an audio frame.
static const uint8_t swb_size_1024_32[]
Definition: aacenc.c:77
NULL
Definition: eval.c:55
typedef void(RENAME(mix_any_func_type))
static void put_audio_specific_config(AVCodecContext *avctx)
Make AAC audio config object.
Definition: aacenc.c:163
int sample_rate
samples per second
static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe)
Encode MS data.
Definition: aacenc.c:290
int frame_bits
number of bits used for the previously encoded frame
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
int bits
number of bits used in the bitresevoir
Definition: psymodel.h:90
#define FF_PROFILE_AAC_LOW
IndividualChannelStream ics
Definition: aac.h:228
uint8_t group_len[8]
Definition: aac.h:162
Describe the class of an AVClass context structure.
Definition: log.h:50
static void put_bitstream_info(AACEncContext *s, const char *name)
Write some auxiliary information about the created AAC file.
Definition: aacenc.c:461
synthesis window for stochastic i
static const uint8_t swb_size_1024_96[]
Definition: aacenc.c:58
int window_shape
window shape (sine/KBD/whatever)
Definition: psymodel.h:67
static void encode_pulses(AACEncContext *s, Pulse *pulse)
Encode pulse data.
Definition: aacenc.c:398
static const uint8_t swb_size_128_16[]
Definition: aacenc.c:120
const uint8_t * swb_sizes
table of scalefactor band sizes for a particular window
Definition: aac.h:165
FFPsyContext psy
Definition: aacenc.h:71
const uint32_t ff_aac_scalefactor_code[121]
Definition: aactab.c:51
static av_cold int alloc_buffers(AVCodecContext *avctx, AACEncContext *s)
Definition: aacenc.c:705
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
const struct FFPsyModel * model
encoder-specific model functions
Definition: psymodel.h:78
FFPsyWindowInfo(* window)(FFPsyContext *ctx, const float *audio, const float *la, int channel, int prev_type)
Suggest window sequence for channel.
Definition: psymodel.h:114
int ms_mode
Signals mid/side stereo flags coding mode (used by encoder)
Definition: aac.h:250
static const uint8_t * swb_size_1024[]
Definition: aacenc.c:101
struct FFPsyPreprocessContext * psypp
Definition: aacenc.h:72
int global_quality
Global quality for codecs which cannot change it per frame.
uint8_t zeroes[128]
band is not coded (used by encoder)
Definition: aac.h:235
int sf_idx[128]
scalefactor indices (used by encoder)
Definition: aac.h:234
AVCodec ff_aac_encoder
Definition: aacenc.c:812
const int avpriv_mpeg4audio_sample_rates[16]
Definition: mpeg4audio.c:57
int aac_coder
Definition: aacenc.h:37
Y Spectral Band Replication.
Definition: mpeg4audio.h:64
#define AAC_CODER_NB
Definition: aacenc.h:33
float * samples
Definition: aacenc.h:82
static av_cold int aac_encode_init(AVCodecContext *avctx)
Definition: aacenc.c:720
common internal api header.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:81
Single Channel Element - used for both SCE and LFE elements.
Definition: aac.h:227
windowing related information
Definition: psymodel.h:65
#define ff_mdct_end
Definition: fft.h:148
av_cold struct FFPsyPreprocessContext * ff_psy_preprocess_init(AVCodecContext *avctx)
psychoacoustic model audio preprocessing initialization
Definition: psymodel.c:96
void ff_psy_preprocess(struct FFPsyPreprocessContext *ctx, float **audio, int channels)
Preprocess several channel in audio frame in order to compress it better.
Definition: psymodel.c:125
static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce)
Encode scalefactors.
Definition: aacenc.c:377
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
#define CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
ChannelElement * cpe
channel elements
Definition: aacenc.h:70
Individual Channel Stream.
Definition: aac.h:157
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
float ff_aac_pow2sf_tab[428]
Definition: aac_tablegen.h:32
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:54
static const uint8_t * swb_size_128[]
Definition: aacenc.c:128
channel element - generic struct for SCE/CPE/CCE/LFE
Definition: aac.h:247
int start
Definition: aac.h:205
FFTContext mdct1024
long (1024 samples) frame transform context
Definition: aacenc.h:61
#define ERROR_IF(cond,...)
Definition: aacenc.c:50
void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int *duration)
Remove frame(s) from the queue.
int channels
number of audio channels
int num_pulse
Definition: aac.h:204
static void encode_band_info(AACEncContext *s, SingleChannelElement *sce)
Encode scalefactor band coding type.
Definition: aacenc.c:366
void(* analyze)(FFPsyContext *ctx, int channel, const float **coeffs, const FFPsyWindowInfo *wi)
Perform psychoacoustic analysis and set band info (threshold, energy) for a group of channels...
Definition: psymodel.h:124
#define HAVE_MIPSDSPR1
Definition: config.h:61
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
enum BandType band_type[128]
band types
Definition: aac.h:231
#define LIBAVCODEC_IDENT
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:700
int frame_number
Frame counter, set by libavcodec.
void ff_aac_tableinit(void)
Definition: aac_tablegen.h:34
Filter the word “frame” indicates either a video frame or a group of audio samples
struct AACEncContext::@27 buffer
void INT64 start
Definition: avisynth_c.h:594
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=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);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_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_dlog(ac->avr,"%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-> out
static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, int common_window)
Encode one channel of audio data.
Definition: aacenc.c:442
void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int bit_exact)
Initialize a float DSP context.
Definition: float_dsp.c:118
static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce, float *audio)
Definition: aacenc.c:249
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:117
AAC data declarations.
av_cold void ff_psy_end(FFPsyContext *ctx)
Cleanup model context at the end.
Definition: psymodel.c:76
This structure stores compressed data.
int delay
Codec delay.
int window_type[3]
window type (short/long/transitional, etc.) - current, previous and next
Definition: psymodel.h:66
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
Definition: aacenc.c:685
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
void ff_init_ff_sine_windows(int index)
initialize the specified entry of ff_sine_windows
#define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)
float * planar_samples[6]
saved preprocessed input
Definition: aacenc.h:64
void(* encode_window_bands_info)(struct AACEncContext *s, SingleChannelElement *sce, int win, int group_len, const float lambda)
Definition: aacenc.h:45
bitstream writer API