libfdk-aacenc.c
Go to the documentation of this file.
1 /*
2  * AAC encoder wrapper
3  * Copyright (c) 2012 Martin Storsjo
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 #include <fdk-aac/aacenc_lib.h>
23 
25 #include "libavutil/common.h"
26 #include "libavutil/opt.h"
27 #include "avcodec.h"
28 #include "audio_frame_queue.h"
29 #include "internal.h"
30 
31 typedef struct AACContext {
32  const AVClass *class;
33  HANDLE_AACENCODER handle;
35  int eld_sbr;
36  int signaling;
37  int latm;
39  int vbr;
40 
42 } AACContext;
43 
44 static const AVOption aac_enc_options[] = {
45  { "afterburner", "Afterburner (improved quality)", offsetof(AACContext, afterburner), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
46  { "eld_sbr", "Enable SBR for ELD (for SBR in other configurations, use the -profile parameter)", offsetof(AACContext, eld_sbr), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
47  { "signaling", "SBR/PS signaling style", offsetof(AACContext, signaling), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 2, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
48  { "default", "Choose signaling implicitly (explicit hierarchical by default, implicit if global header is disabled)", 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
49  { "implicit", "Implicit backwards compatible signaling", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
50  { "explicit_sbr", "Explicit SBR, implicit PS signaling", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
51  { "explicit_hierarchical", "Explicit hierarchical signaling", 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
52  { "latm", "Output LATM/LOAS encapsulated data", offsetof(AACContext, latm), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
53  { "header_period", "StreamMuxConfig and PCE repetition period (in frames)", offsetof(AACContext, header_period), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xffff, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
54  { "vbr", "VBR mode (1-5)", offsetof(AACContext, vbr), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 5, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
55  { NULL }
56 };
57 
58 static const AVClass aac_enc_class = {
60 };
61 
62 static const char *aac_get_error(AACENC_ERROR err)
63 {
64  switch (err) {
65  case AACENC_OK:
66  return "No error";
67  case AACENC_INVALID_HANDLE:
68  return "Invalid handle";
69  case AACENC_MEMORY_ERROR:
70  return "Memory allocation error";
71  case AACENC_UNSUPPORTED_PARAMETER:
72  return "Unsupported parameter";
73  case AACENC_INVALID_CONFIG:
74  return "Invalid config";
75  case AACENC_INIT_ERROR:
76  return "Initialization error";
77  case AACENC_INIT_AAC_ERROR:
78  return "AAC library initialization error";
79  case AACENC_INIT_SBR_ERROR:
80  return "SBR library initialization error";
81  case AACENC_INIT_TP_ERROR:
82  return "Transport library initialization error";
83  case AACENC_INIT_META_ERROR:
84  return "Metadata library initialization error";
85  case AACENC_ENCODE_ERROR:
86  return "Encoding error";
87  case AACENC_ENCODE_EOF:
88  return "End of file";
89  default:
90  return "Unknown error";
91  }
92 }
93 
95 {
96  AACContext *s = avctx->priv_data;
97 
98  if (s->handle)
99  aacEncClose(&s->handle);
100  av_freep(&avctx->extradata);
101  ff_af_queue_close(&s->afq);
102 
103  return 0;
104 }
105 
107 {
108  AACContext *s = avctx->priv_data;
109  int ret = AVERROR(EINVAL);
110  AACENC_InfoStruct info = { 0 };
111  CHANNEL_MODE mode;
112  AACENC_ERROR err;
113  int aot = FF_PROFILE_AAC_LOW + 1;
114  int sce = 0, cpe = 0;
115 
116  if ((err = aacEncOpen(&s->handle, 0, avctx->channels)) != AACENC_OK) {
117  av_log(avctx, AV_LOG_ERROR, "Unable to open the encoder: %s\n",
118  aac_get_error(err));
119  goto error;
120  }
121 
122  if (avctx->profile != FF_PROFILE_UNKNOWN)
123  aot = avctx->profile + 1;
124 
125  if ((err = aacEncoder_SetParam(s->handle, AACENC_AOT, aot)) != AACENC_OK) {
126  av_log(avctx, AV_LOG_ERROR, "Unable to set the AOT %d: %s\n",
127  aot, aac_get_error(err));
128  goto error;
129  }
130 
131  if (aot == FF_PROFILE_AAC_ELD + 1 && s->eld_sbr) {
132  if ((err = aacEncoder_SetParam(s->handle, AACENC_SBR_MODE,
133  1)) != AACENC_OK) {
134  av_log(avctx, AV_LOG_ERROR, "Unable to enable SBR for ELD: %s\n",
135  aac_get_error(err));
136  goto error;
137  }
138  }
139 
140  if ((err = aacEncoder_SetParam(s->handle, AACENC_SAMPLERATE,
141  avctx->sample_rate)) != AACENC_OK) {
142  av_log(avctx, AV_LOG_ERROR, "Unable to set the sample rate %d: %s\n",
143  avctx->sample_rate, aac_get_error(err));
144  goto error;
145  }
146 
147  switch (avctx->channels) {
148  case 1: mode = MODE_1; sce = 1; cpe = 0; break;
149  case 2: mode = MODE_2; sce = 0; cpe = 1; break;
150  case 3: mode = MODE_1_2; sce = 1; cpe = 1; break;
151  case 4: mode = MODE_1_2_1; sce = 2; cpe = 1; break;
152  case 5: mode = MODE_1_2_2; sce = 1; cpe = 2; break;
153  case 6: mode = MODE_1_2_2_1; sce = 2; cpe = 2; break;
154  default:
155  av_log(avctx, AV_LOG_ERROR,
156  "Unsupported number of channels %d\n", avctx->channels);
157  goto error;
158  }
159 
160  if ((err = aacEncoder_SetParam(s->handle, AACENC_CHANNELMODE,
161  mode)) != AACENC_OK) {
162  av_log(avctx, AV_LOG_ERROR,
163  "Unable to set channel mode %d: %s\n", mode, aac_get_error(err));
164  goto error;
165  }
166 
167  if ((err = aacEncoder_SetParam(s->handle, AACENC_CHANNELORDER,
168  1)) != AACENC_OK) {
169  av_log(avctx, AV_LOG_ERROR,
170  "Unable to set wav channel order %d: %s\n",
171  mode, aac_get_error(err));
172  goto error;
173  }
174 
175  if (avctx->flags & CODEC_FLAG_QSCALE || s->vbr) {
176  int mode = s->vbr ? s->vbr : avctx->global_quality;
177  if (mode < 1 || mode > 5) {
178  av_log(avctx, AV_LOG_WARNING,
179  "VBR quality %d out of range, should be 1-5\n", mode);
180  mode = av_clip(mode, 1, 5);
181  }
182  av_log(avctx, AV_LOG_WARNING,
183  "Note, the VBR setting is unsupported and only works with "
184  "some parameter combinations\n");
185  if ((err = aacEncoder_SetParam(s->handle, AACENC_BITRATEMODE,
186  mode)) != AACENC_OK) {
187  av_log(avctx, AV_LOG_ERROR, "Unable to set the VBR bitrate mode %d: %s\n",
188  mode, aac_get_error(err));
189  goto error;
190  }
191  } else {
192  if (avctx->bit_rate <= 0) {
193  if (avctx->profile == FF_PROFILE_AAC_HE_V2) {
194  sce = 1;
195  cpe = 0;
196  }
197  avctx->bit_rate = (96*sce + 128*cpe) * avctx->sample_rate / 44;
198  if (avctx->profile == FF_PROFILE_AAC_HE ||
199  avctx->profile == FF_PROFILE_AAC_HE_V2 ||
200  s->eld_sbr)
201  avctx->bit_rate /= 2;
202  }
203  if ((err = aacEncoder_SetParam(s->handle, AACENC_BITRATE,
204  avctx->bit_rate)) != AACENC_OK) {
205  av_log(avctx, AV_LOG_ERROR, "Unable to set the bitrate %d: %s\n",
206  avctx->bit_rate, aac_get_error(err));
207  goto error;
208  }
209  }
210 
211  /* Choose bitstream format - if global header is requested, use
212  * raw access units, otherwise use ADTS. */
213  if ((err = aacEncoder_SetParam(s->handle, AACENC_TRANSMUX,
214  avctx->flags & CODEC_FLAG_GLOBAL_HEADER ? 0 : s->latm ? 10 : 2)) != AACENC_OK) {
215  av_log(avctx, AV_LOG_ERROR, "Unable to set the transmux format: %s\n",
216  aac_get_error(err));
217  goto error;
218  }
219 
220  if (s->latm && s->header_period) {
221  if ((err = aacEncoder_SetParam(s->handle, AACENC_HEADER_PERIOD,
222  s->header_period)) != AACENC_OK) {
223  av_log(avctx, AV_LOG_ERROR, "Unable to set header period: %s\n",
224  aac_get_error(err));
225  goto error;
226  }
227  }
228 
229  /* If no signaling mode is chosen, use explicit hierarchical signaling
230  * if using mp4 mode (raw access units, with global header) and
231  * implicit signaling if using ADTS. */
232  if (s->signaling < 0)
233  s->signaling = avctx->flags & CODEC_FLAG_GLOBAL_HEADER ? 2 : 0;
234 
235  if ((err = aacEncoder_SetParam(s->handle, AACENC_SIGNALING_MODE,
236  s->signaling)) != AACENC_OK) {
237  av_log(avctx, AV_LOG_ERROR, "Unable to set signaling mode %d: %s\n",
238  s->signaling, aac_get_error(err));
239  goto error;
240  }
241 
242  if ((err = aacEncoder_SetParam(s->handle, AACENC_AFTERBURNER,
243  s->afterburner)) != AACENC_OK) {
244  av_log(avctx, AV_LOG_ERROR, "Unable to set afterburner to %d: %s\n",
245  s->afterburner, aac_get_error(err));
246  goto error;
247  }
248 
249  if (avctx->cutoff > 0) {
250  if (avctx->cutoff < (avctx->sample_rate + 255) >> 8 || avctx->cutoff > 20000) {
251  av_log(avctx, AV_LOG_ERROR, "cutoff valid range is %d-20000\n",
252  (avctx->sample_rate + 255) >> 8);
253  goto error;
254  }
255  if ((err = aacEncoder_SetParam(s->handle, AACENC_BANDWIDTH,
256  avctx->cutoff)) != AACENC_OK) {
257  av_log(avctx, AV_LOG_ERROR, "Unable to set the encoder bandwidth to %d: %s\n",
258  avctx->cutoff, aac_get_error(err));
259  goto error;
260  }
261  }
262 
263  if ((err = aacEncEncode(s->handle, NULL, NULL, NULL, NULL)) != AACENC_OK) {
264  av_log(avctx, AV_LOG_ERROR, "Unable to initialize the encoder: %s\n",
265  aac_get_error(err));
266  return AVERROR(EINVAL);
267  }
268 
269  if ((err = aacEncInfo(s->handle, &info)) != AACENC_OK) {
270  av_log(avctx, AV_LOG_ERROR, "Unable to get encoder info: %s\n",
271  aac_get_error(err));
272  goto error;
273  }
274 
275  avctx->frame_size = info.frameLength;
276  avctx->delay = info.encoderDelay;
277  ff_af_queue_init(avctx, &s->afq);
278 
279  if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) {
280  avctx->extradata_size = info.confSize;
281  avctx->extradata = av_mallocz(avctx->extradata_size +
283  if (!avctx->extradata) {
284  ret = AVERROR(ENOMEM);
285  goto error;
286  }
287 
288  memcpy(avctx->extradata, info.confBuf, info.confSize);
289  }
290  return 0;
291 error:
292  aac_encode_close(avctx);
293  return ret;
294 }
295 
297  const AVFrame *frame, int *got_packet_ptr)
298 {
299  AACContext *s = avctx->priv_data;
300  AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
301  AACENC_InArgs in_args = { 0 };
302  AACENC_OutArgs out_args = { 0 };
303  int in_buffer_identifier = IN_AUDIO_DATA;
304  int in_buffer_size, in_buffer_element_size;
305  int out_buffer_identifier = OUT_BITSTREAM_DATA;
306  int out_buffer_size, out_buffer_element_size;
307  void *in_ptr, *out_ptr;
308  int ret;
309  AACENC_ERROR err;
310 
311  /* handle end-of-stream small frame and flushing */
312  if (!frame) {
313  in_args.numInSamples = -1;
314  } else {
315  in_ptr = frame->data[0];
316  in_buffer_size = 2 * avctx->channels * frame->nb_samples;
317  in_buffer_element_size = 2;
318 
319  in_args.numInSamples = avctx->channels * frame->nb_samples;
320  in_buf.numBufs = 1;
321  in_buf.bufs = &in_ptr;
322  in_buf.bufferIdentifiers = &in_buffer_identifier;
323  in_buf.bufSizes = &in_buffer_size;
324  in_buf.bufElSizes = &in_buffer_element_size;
325 
326  /* add current frame to the queue */
327  if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
328  return ret;
329  }
330 
331  /* The maximum packet size is 6144 bits aka 768 bytes per channel. */
332  if ((ret = ff_alloc_packet2(avctx, avpkt, FFMAX(8192, 768 * avctx->channels))) < 0)
333  return ret;
334 
335  out_ptr = avpkt->data;
336  out_buffer_size = avpkt->size;
337  out_buffer_element_size = 1;
338  out_buf.numBufs = 1;
339  out_buf.bufs = &out_ptr;
340  out_buf.bufferIdentifiers = &out_buffer_identifier;
341  out_buf.bufSizes = &out_buffer_size;
342  out_buf.bufElSizes = &out_buffer_element_size;
343 
344  if ((err = aacEncEncode(s->handle, &in_buf, &out_buf, &in_args,
345  &out_args)) != AACENC_OK) {
346  if (!frame && err == AACENC_ENCODE_EOF)
347  return 0;
348  av_log(avctx, AV_LOG_ERROR, "Unable to encode frame: %s\n",
349  aac_get_error(err));
350  return AVERROR(EINVAL);
351  }
352 
353  if (!out_args.numOutBytes)
354  return 0;
355 
356  /* Get the next frame pts & duration */
357  ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
358  &avpkt->duration);
359 
360  avpkt->size = out_args.numOutBytes;
361  *got_packet_ptr = 1;
362  return 0;
363 }
364 
365 static const AVProfile profiles[] = {
366  { FF_PROFILE_AAC_LOW, "LC" },
367  { FF_PROFILE_AAC_HE, "HE-AAC" },
368  { FF_PROFILE_AAC_HE_V2, "HE-AACv2" },
369  { FF_PROFILE_AAC_LD, "LD" },
370  { FF_PROFILE_AAC_ELD, "ELD" },
371  { FF_PROFILE_UNKNOWN },
372 };
373 
375  { "b", "0" },
376  { NULL }
377 };
378 
379 static const uint64_t aac_channel_layout[] = {
386  0,
387 };
388 
389 static const int aac_sample_rates[] = {
390  96000, 88200, 64000, 48000, 44100, 32000,
391  24000, 22050, 16000, 12000, 11025, 8000, 0
392 };
393 
395  .name = "libfdk_aac",
396  .type = AVMEDIA_TYPE_AUDIO,
397  .id = AV_CODEC_ID_AAC,
398  .priv_data_size = sizeof(AACContext),
400  .encode2 = aac_encode_frame,
403  .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
405  .long_name = NULL_IF_CONFIG_SMALL("Fraunhofer FDK AAC"),
406  .priv_class = &aac_enc_class,
407  .defaults = aac_encode_defaults,
408  .profiles = profiles,
409  .supported_samplerates = aac_sample_rates,
410  .channel_layouts = aac_channel_layout,
411 };
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const char * s
Definition: avisynth_c.h:668
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
#define FF_PROFILE_AAC_ELD
HANDLE_AACENCODER handle
Definition: libfdk-aacenc.c:33
AVOption.
Definition: opt.h:251
AVCodecContext * avctx
Definition: aac.h:264
av_default_item_name
static const int aac_sample_rates[]
#define AV_CH_LAYOUT_SURROUND
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
#define AV_OPT_FLAG_AUDIO_PARAM
Definition: opt.h:284
#define AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_STEREO
signed 16 bits
Definition: samplefmt.h:52
struct AACContext AACContext
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
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
#define av_cold
Definition: attributes.h:78
static int aac_encode_close(AVCodecContext *avctx)
Definition: libfdk-aacenc.c:94
mode
Definition: f_perms.c:27
AVOptions.
AVCodec ff_libfdk_aac_encoder
AudioFrameQueue afq
Definition: libfdk-aacenc.c:41
#define CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
#define FF_PROFILE_UNKNOWN
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static const AVClass aac_enc_class
Definition: libfdk-aacenc.c:58
uint8_t * data
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
Definition: opt.h:281
static av_cold int aac_encode_init(AVCodecContext *avctx)
#define FF_PROFILE_AAC_HE
#define FF_PROFILE_AAC_HE_V2
#define CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#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. ...
int flags
CODEC_FLAG_*.
int header_period
Definition: libfdk-aacenc.c:38
#define CODEC_FLAG_QSCALE
Use fixed qscale.
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
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
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
MIPS optimizations info
Definition: mips.txt:2
int bit_rate
the average bitrate
audio channel layout utility functions
ret
Definition: avfilter.c:821
#define AV_CH_LAYOUT_5POINT1_BACK
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
int frame_size
Number of samples per channel in an audio frame.
NULL
Definition: eval.c:55
int sample_rate
samples per second
main external API structure.
static const AVCodecDefault aac_encode_defaults[]
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
#define FF_PROFILE_AAC_LOW
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
Describe the class of an AVClass context structure.
Definition: log.h:50
static const AVProfile profiles[]
#define AV_CH_LAYOUT_5POINT0_BACK
main AAC context
Definition: aac.h:262
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
int global_quality
Global quality for codecs which cannot change it per frame.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
AVFrame * frame
Definition: aac.h:265
common internal api header.
common internal and external API header
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
AVProfile.
static const AVOption aac_enc_options[]
Definition: libfdk-aacenc.c:44
static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int cutoff
Audio cutoff bandwidth (0 means "automatic")
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
static const uint64_t aac_channel_layout[]
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:700
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int delay
Codec delay.
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define FF_PROFILE_AAC_LD
static const char * aac_get_error(AACENC_ERROR err)
Definition: libfdk-aacenc.c:62