FFmpeg
Loading...
Searching...
No Matches
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 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include <fdk-aac/aacenc_lib.h>
21
23#include "libavutil/common.h"
25#include "libavutil/mem.h"
26#include "libavutil/opt.h"
27#include "avcodec.h"
28#include "audio_frame_queue.h"
29#include "codec_internal.h"
30#include "encode.h"
31#include "profiles.h"
32
33#ifdef AACENCODER_LIB_VL0
34#define FDKENC_VER_AT_LEAST(vl0, vl1) \
35 ((AACENCODER_LIB_VL0 > vl0) || \
36 (AACENCODER_LIB_VL0 == vl0 && AACENCODER_LIB_VL1 >= vl1))
37#else
38#define FDKENC_VER_AT_LEAST(vl0, vl1) 0
39#endif
40
62
63static const AVOption aac_enc_options[] = {
64 { "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 },
65 { "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 },
66#if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
67 { "eld_v2", "Enable ELDv2 (LD-MPS extension for ELD stereo signals)", offsetof(AACContext, eld_v2), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
68#endif
69 { "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, .unit = "signaling" },
70 { "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, .unit = "signaling" },
71 { "implicit", "Implicit backwards compatible signaling", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, .unit = "signaling" },
72 { "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, .unit = "signaling" },
73 { "explicit_hierarchical", "Explicit hierarchical signaling", 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, .unit = "signaling" },
74 { "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 },
75 { "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 },
76 { "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 },
77 { "drc_profile", "The desired compression profile for AAC DRC", offsetof(AACContext, drc_profile), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 256, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
78 { "drc_target_ref", "Expected target reference level at decoder side in dB (for clipping prevention/limiter)", offsetof(AACContext, drc_target_ref), AV_OPT_TYPE_INT, { .i64 = 0.0 }, -31.75, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
79 { "comp_profile", "The desired compression profile for AAC DRC", offsetof(AACContext, comp_profile), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 256, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
80 { "comp_target_ref", "Expected target reference level at decoder side in dB (for clipping prevention/limiter)", offsetof(AACContext, comp_target_ref), AV_OPT_TYPE_INT, { .i64 = 0.0 }, -31.75, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
81 { "prog_ref", "The program reference level or dialog level in dB", offsetof(AACContext, prog_ref), AV_OPT_TYPE_INT, { .i64 = 0.0 }, -31.75, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
82 { "frame_length", "The desired frame length", offsetof(AACContext, frame_length), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1024, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
84 { NULL }
85};
86
87static const AVClass aac_enc_class = {
88 .class_name = "libfdk_aac",
89 .item_name = av_default_item_name,
90 .option = aac_enc_options,
91 .version = LIBAVUTIL_VERSION_INT,
92};
93
94static const char *aac_get_error(AACENC_ERROR err)
95{
96 switch (err) {
97 case AACENC_OK:
98 return "No error";
99 case AACENC_INVALID_HANDLE:
100 return "Invalid handle";
101 case AACENC_MEMORY_ERROR:
102 return "Memory allocation error";
103 case AACENC_UNSUPPORTED_PARAMETER:
104 return "Unsupported parameter";
105 case AACENC_INVALID_CONFIG:
106 return "Invalid config";
107 case AACENC_INIT_ERROR:
108 return "Initialization error";
109 case AACENC_INIT_AAC_ERROR:
110 return "AAC library initialization error";
111 case AACENC_INIT_SBR_ERROR:
112 return "SBR library initialization error";
113 case AACENC_INIT_TP_ERROR:
114 return "Transport library initialization error";
115 case AACENC_INIT_META_ERROR:
116 return "Metadata library initialization error";
117 case AACENC_ENCODE_ERROR:
118 return "Encoding error";
119 case AACENC_ENCODE_EOF:
120 return "End of file";
121 default:
122 return "Unknown error";
123 }
124}
125
127{
128 AACContext *s = avctx->priv_data;
129
130 if (s->handle)
131 aacEncClose(&s->handle);
132 ff_af_queue_close(&s->afq);
133
134 return 0;
135}
136
138{
139 AACContext *s = avctx->priv_data;
140 AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
141 AACENC_InArgs in_args = { 0 };
142 AACENC_OutArgs out_args;
143 uint8_t dummy_in[1], dummy_out[1];
144 int in_buffer_identifiers[] = { IN_AUDIO_DATA, IN_METADATA_SETUP };
145 int in_buffer_element_sizes[] = { 2, sizeof(AACENC_MetaData) };
146 int in_buffer_sizes[] = { 0, sizeof(s->metaDataSetup) };
147 int out_buffer_identifier = OUT_BITSTREAM_DATA;
148 int out_buffer_size = sizeof(dummy_out), out_buffer_element_size = 1;
149 void* inBuffer[] = { dummy_in, &s->metaDataSetup };
150 void *out_ptr = dummy_out;
151 AACENC_ERROR err;
152
153 ff_af_queue_remove(&s->afq, s->afq.frame_count, NULL);
154
155 in_buf.bufs = (void **)inBuffer;
156 in_buf.numBufs = s->metadata_mode == 0 ? 1 : 2;
157 in_buf.bufferIdentifiers = in_buffer_identifiers;
158 in_buf.bufSizes = in_buffer_sizes;
159 in_buf.bufElSizes = in_buffer_element_sizes;
160
161 out_buf.numBufs = 1;
162 out_buf.bufs = &out_ptr;
163 out_buf.bufferIdentifiers = &out_buffer_identifier;
164 out_buf.bufSizes = &out_buffer_size;
165 out_buf.bufElSizes = &out_buffer_element_size;
166
167 err = aacEncEncode(s->handle, &in_buf, &out_buf, &in_args, &out_args);
168 if (err != AACENC_OK) {
169 av_log(avctx, AV_LOG_ERROR, "Unexpected error while flushing: %s\n",
170 aac_get_error(err));
171 }
172}
173
175{
176 AACContext *s = avctx->priv_data;
177 int ret = AVERROR(EINVAL);
178 AACENC_InfoStruct info = { 0 };
179 AVCPBProperties *cpb_props;
180 CHANNEL_MODE mode;
181 AACENC_ERROR err;
182 int aot = AV_PROFILE_AAC_LOW + 1;
183 int sce = 0, cpe = 0;
184
185 if ((err = aacEncOpen(&s->handle, 0, avctx->ch_layout.nb_channels)) != AACENC_OK) {
186 av_log(avctx, AV_LOG_ERROR, "Unable to open the encoder: %s\n",
187 aac_get_error(err));
188 goto error;
189 }
190
191 if (avctx->profile != AV_PROFILE_UNKNOWN)
192 aot = avctx->profile + 1;
193
194 if ((err = aacEncoder_SetParam(s->handle, AACENC_AOT, aot)) != AACENC_OK) {
195 av_log(avctx, AV_LOG_ERROR, "Unable to set the AOT %d: %s\n",
196 aot, aac_get_error(err));
197 goto error;
198 }
199
200 if (aot == AV_PROFILE_AAC_ELD + 1 && s->eld_sbr) {
201 if ((err = aacEncoder_SetParam(s->handle, AACENC_SBR_MODE,
202 1)) != AACENC_OK) {
203 av_log(avctx, AV_LOG_ERROR, "Unable to enable SBR for ELD: %s\n",
204 aac_get_error(err));
205 goto error;
206 }
207 }
208
209 if (s->frame_length >= 0) {
210 if ((err = aacEncoder_SetParam(s->handle, AACENC_GRANULE_LENGTH,
211 s->frame_length)) != AACENC_OK) {
212 av_log(avctx, AV_LOG_ERROR, "Unable to set granule length: %s\n",
213 aac_get_error(err));
214 goto error;
215 }
216 }
217
218 if ((err = aacEncoder_SetParam(s->handle, AACENC_SAMPLERATE,
219 avctx->sample_rate)) != AACENC_OK) {
220 av_log(avctx, AV_LOG_ERROR, "Unable to set the sample rate %d: %s\n",
221 avctx->sample_rate, aac_get_error(err));
222 goto error;
223 }
224
225 switch (avctx->ch_layout.nb_channels) {
226 case 1: mode = MODE_1; sce = 1; cpe = 0; break;
227 case 2:
228#if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
229 // (profile + 1) to map from profile range to AOT range
230 if (aot == AV_PROFILE_AAC_ELD + 1 && s->eld_v2) {
231 if ((err = aacEncoder_SetParam(s->handle, AACENC_CHANNELMODE,
232 128)) != AACENC_OK) {
233 av_log(avctx, AV_LOG_ERROR, "Unable to enable ELDv2: %s\n",
234 aac_get_error(err));
235 goto error;
236 } else {
237 mode = MODE_212;
238 sce = 1;
239 cpe = 0;
240 }
241 } else
242#endif
243 {
244 mode = MODE_2;
245 sce = 0;
246 cpe = 1;
247 }
248 break;
249 case 3: mode = MODE_1_2; sce = 1; cpe = 1; break;
250 case 4: mode = MODE_1_2_1; sce = 2; cpe = 1; break;
251 case 5: mode = MODE_1_2_2; sce = 1; cpe = 2; break;
252 case 6: mode = MODE_1_2_2_1; sce = 2; cpe = 2; break;
253#if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
254 case 7: mode = MODE_6_1; sce = 3; cpe = 2; break;
255#endif
256/* The version macro is introduced the same time as the 7.1 support, so this
257 should suffice. */
258#if FDKENC_VER_AT_LEAST(3, 4) // 3.4.12
259 case 8:
260 sce = 2;
261 cpe = 3;
263 mode = MODE_7_1_REAR_SURROUND;
264#if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
266 mode = MODE_7_1_TOP_FRONT;
267#endif
268 } else {
269 // MODE_1_2_2_2_1 and MODE_7_1_FRONT_CENTER use the same channel layout
270 mode = MODE_7_1_FRONT_CENTER;
271 }
272 break;
273#endif
274 default:
275 av_log(avctx, AV_LOG_ERROR,
276 "Unsupported number of channels %d\n", avctx->ch_layout.nb_channels);
277 goto error;
278 }
279
280 if ((err = aacEncoder_SetParam(s->handle, AACENC_CHANNELMODE,
281 mode)) != AACENC_OK) {
282 av_log(avctx, AV_LOG_ERROR,
283 "Unable to set channel mode %d: %s\n", mode, aac_get_error(err));
284 goto error;
285 }
286
287 if ((err = aacEncoder_SetParam(s->handle, AACENC_CHANNELORDER,
288 1)) != AACENC_OK) {
289 av_log(avctx, AV_LOG_ERROR,
290 "Unable to set wav channel order %d: %s\n",
291 mode, aac_get_error(err));
292 goto error;
293 }
294
295 if (avctx->flags & AV_CODEC_FLAG_QSCALE || s->vbr) {
296 int mode = s->vbr ? s->vbr : avctx->global_quality;
297 if (mode < 1 || mode > 5) {
298 av_log(avctx, AV_LOG_WARNING,
299 "VBR quality %d out of range, should be 1-5\n", mode);
300 mode = av_clip(mode, 1, 5);
301 }
302 av_log(avctx, AV_LOG_WARNING,
303 "Note, the VBR setting is unsupported and only works with "
304 "some parameter combinations\n");
305 if ((err = aacEncoder_SetParam(s->handle, AACENC_BITRATEMODE,
306 mode)) != AACENC_OK) {
307 av_log(avctx, AV_LOG_ERROR, "Unable to set the VBR bitrate mode %d: %s\n",
308 mode, aac_get_error(err));
309 goto error;
310 }
311 } else {
312 if (avctx->bit_rate <= 0) {
313 if (avctx->profile == AV_PROFILE_AAC_HE_V2) {
314 sce = 1;
315 cpe = 0;
316 }
317 avctx->bit_rate = (96*sce + 128*cpe) * avctx->sample_rate / 44;
318 if (avctx->profile == AV_PROFILE_AAC_HE ||
319 avctx->profile == AV_PROFILE_AAC_HE_V2 ||
321 s->eld_sbr)
322 avctx->bit_rate /= 2;
323 }
324 if ((err = aacEncoder_SetParam(s->handle, AACENC_BITRATE,
325 avctx->bit_rate)) != AACENC_OK) {
326 av_log(avctx, AV_LOG_ERROR, "Unable to set the bitrate %"PRId64": %s\n",
327 avctx->bit_rate, aac_get_error(err));
328 goto error;
329 }
330 }
331
332 /* Choose bitstream format - if global header is requested, use
333 * raw access units, otherwise use ADTS. */
334 if ((err = aacEncoder_SetParam(s->handle, AACENC_TRANSMUX,
335 avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER ? TT_MP4_RAW :
336 s->latm ? TT_MP4_LOAS : TT_MP4_ADTS)) != AACENC_OK) {
337 av_log(avctx, AV_LOG_ERROR, "Unable to set the transmux format: %s\n",
338 aac_get_error(err));
339 goto error;
340 }
341
342 if (s->latm && s->header_period) {
343 if ((err = aacEncoder_SetParam(s->handle, AACENC_HEADER_PERIOD,
344 s->header_period)) != AACENC_OK) {
345 av_log(avctx, AV_LOG_ERROR, "Unable to set header period: %s\n",
346 aac_get_error(err));
347 goto error;
348 }
349 }
350
351 /* If no signaling mode is chosen, use explicit hierarchical signaling
352 * if using mp4 mode (raw access units, with global header) and
353 * implicit signaling if using ADTS. */
354 if (s->signaling < 0)
355 s->signaling = avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER ? 2 : 0;
356
357 if ((err = aacEncoder_SetParam(s->handle, AACENC_SIGNALING_MODE,
358 s->signaling)) != AACENC_OK) {
359 av_log(avctx, AV_LOG_ERROR, "Unable to set signaling mode %d: %s\n",
360 s->signaling, aac_get_error(err));
361 goto error;
362 }
363
364 if ((err = aacEncoder_SetParam(s->handle, AACENC_AFTERBURNER,
365 s->afterburner)) != AACENC_OK) {
366 av_log(avctx, AV_LOG_ERROR, "Unable to set afterburner to %d: %s\n",
367 s->afterburner, aac_get_error(err));
368 goto error;
369 }
370
371 if (avctx->cutoff > 0) {
372 if (avctx->cutoff < (avctx->sample_rate + 255) >> 8 || avctx->cutoff > 20000) {
373 av_log(avctx, AV_LOG_ERROR, "cutoff valid range is %d-20000\n",
374 (avctx->sample_rate + 255) >> 8);
375 goto error;
376 }
377 if ((err = aacEncoder_SetParam(s->handle, AACENC_BANDWIDTH,
378 avctx->cutoff)) != AACENC_OK) {
379 av_log(avctx, AV_LOG_ERROR, "Unable to set the encoder bandwidth to %d: %s\n",
380 avctx->cutoff, aac_get_error(err));
381 goto error;
382 }
383 }
384
385 s->metadata_mode = 0;
386 if (s->prog_ref) {
387 s->metadata_mode = 1;
388 s->metaDataSetup.prog_ref_level_present = 1;
389 s->metaDataSetup.prog_ref_level = s->prog_ref << 16;
390 }
391 if (s->drc_profile) {
392 s->metadata_mode = 1;
393 s->metaDataSetup.drc_profile = s->drc_profile;
394 s->metaDataSetup.drc_TargetRefLevel = s->drc_target_ref << 16;
395 if (s->comp_profile) {
396 /* Including the comp_profile means that we need to set the mode to ETSI */
397 s->metadata_mode = 2;
398 s->metaDataSetup.comp_profile = s->comp_profile;
399 s->metaDataSetup.comp_TargetRefLevel = s->comp_target_ref << 16;
400 }
401 }
402
403 if ((err = aacEncoder_SetParam(s->handle, AACENC_METADATA_MODE, s->metadata_mode)) != AACENC_OK) {
404 av_log(avctx, AV_LOG_ERROR, "Unable to set metadata mode to %d: %s\n",
405 s->metadata_mode, aac_get_error(err));
406 goto error;
407 }
408
409 if ((err = aacEncEncode(s->handle, NULL, NULL, NULL, NULL)) != AACENC_OK) {
410 av_log(avctx, AV_LOG_ERROR, "Unable to initialize the encoder: %s\n",
411 aac_get_error(err));
412 return AVERROR(EINVAL);
413 }
414
415 if ((err = aacEncInfo(s->handle, &info)) != AACENC_OK) {
416 av_log(avctx, AV_LOG_ERROR, "Unable to get encoder info: %s\n",
417 aac_get_error(err));
418 goto error;
419 }
420
421 avctx->frame_size = info.frameLength;
422#if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
423 avctx->initial_padding = info.nDelay;
424#else
425 avctx->initial_padding = info.encoderDelay;
426#endif
427 ff_af_queue_init(avctx, &s->afq);
428
429 if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
430 avctx->extradata_size = info.confSize;
431 avctx->extradata = av_mallocz(avctx->extradata_size +
433 if (!avctx->extradata) {
434 ret = AVERROR(ENOMEM);
435 goto error;
436 }
437
438 memcpy(avctx->extradata, info.confBuf, info.confSize);
439 }
440
441 cpb_props = ff_encode_add_cpb_side_data(avctx);
442 if (!cpb_props) {
443 ret = AVERROR(ENOMEM);
444 goto error;
445 }
446 cpb_props->max_bitrate =
447 cpb_props->min_bitrate =
448 cpb_props->avg_bitrate = avctx->bit_rate;
449
450 return 0;
451error:
452 aac_encode_close(avctx);
453 return ret;
454}
455
456static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
457 const AVFrame *frame, int *got_packet_ptr)
458{
459 AACContext *s = avctx->priv_data;
460 AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
461 AACENC_InArgs in_args = { 0 };
462 AACENC_OutArgs out_args = { 0 };
463 void* inBuffer[] = { 0, &s->metaDataSetup };
464 int in_buffer_identifiers[] = { IN_AUDIO_DATA, IN_METADATA_SETUP };
465 int in_buffer_element_sizes[] = { 2, sizeof(AACENC_MetaData) };
466 int in_buffer_sizes[] = { 0, sizeof(s->metaDataSetup) };
467 int out_buffer_identifier = OUT_BITSTREAM_DATA;
468 int out_buffer_size, out_buffer_element_size;
469 void *out_ptr;
470 int ret;
471 uint8_t dummy_buf[1];
472 AACENC_ERROR err;
473
474 /* handle end-of-stream small frame and flushing */
475 if (!frame) {
476 /* Must be a non-null pointer, even if it's a dummy. We could use
477 * the address of anything else on the stack as well. */
478 inBuffer[0] = dummy_buf;
479
480 in_args.numInSamples = -1;
481 } else {
482 inBuffer[0] = frame->data[0];
483 in_buffer_sizes[0] = 2 * avctx->ch_layout.nb_channels * frame->nb_samples;
484
485 in_args.numInSamples = avctx->ch_layout.nb_channels * frame->nb_samples;
486
487 /* add current frame to the queue */
488 if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
489 return ret;
490 }
491
492 if (s->metadata_mode == 0) {
493 in_buf.numBufs = 1;
494 } else {
495 in_buf.numBufs = 2;
496 }
497
498 in_buf.bufs = (void**)inBuffer;
499 in_buf.bufferIdentifiers = in_buffer_identifiers;
500 in_buf.bufSizes = in_buffer_sizes;
501 in_buf.bufElSizes = in_buffer_element_sizes;
502
503 /* The maximum packet size is 6144 bits aka 768 bytes per channel. */
504 ret = ff_alloc_packet(avctx, avpkt, FFMAX(8192, 768 * avctx->ch_layout.nb_channels));
505 if (ret < 0)
506 return ret;
507
508 out_ptr = avpkt->data;
509 out_buffer_size = avpkt->size;
510 out_buffer_element_size = 1;
511 out_buf.numBufs = 1;
512 out_buf.bufs = &out_ptr;
513 out_buf.bufferIdentifiers = &out_buffer_identifier;
514 out_buf.bufSizes = &out_buffer_size;
515 out_buf.bufElSizes = &out_buffer_element_size;
516
517 if ((err = aacEncEncode(s->handle, &in_buf, &out_buf, &in_args,
518 &out_args)) != AACENC_OK) {
519 if (!frame && err == AACENC_ENCODE_EOF)
520 return 0;
521 av_log(avctx, AV_LOG_ERROR, "Unable to encode frame: %s\n",
522 aac_get_error(err));
523 return AVERROR(EINVAL);
524 }
525
526 if (!out_args.numOutBytes)
527 return 0;
528
529 /* Get the next frame pts & duration */
530 ret = ff_af_queue_remove(&s->afq, avctx->frame_size, avpkt);
531 if (ret < 0)
532 return ret;
533
534 avpkt->size = out_args.numOutBytes;
535 avpkt->flags |= AV_PKT_FLAG_KEY;
536 *got_packet_ptr = 1;
537 return 0;
538}
539
540static const AVProfile profiles[] = {
541 { AV_PROFILE_AAC_LOW, "LC" },
542 { AV_PROFILE_AAC_HE, "HE-AAC" },
543 { AV_PROFILE_AAC_HE_V2, "HE-AACv2" },
544 { AV_PROFILE_AAC_LD, "LD" },
545 { AV_PROFILE_AAC_ELD, "ELD" },
547};
548
550 { "b", "0" },
551 { NULL }
552};
553
554static const AVChannelLayout aac_ch_layouts[16] = {
561#if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
563#endif
564#if FDKENC_VER_AT_LEAST(3, 4) // 3.4.12
567#endif
568#if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
570#endif
571 { 0 },
572};
573
574static const int aac_sample_rates[] = {
575 96000, 88200, 64000, 48000, 44100, 32000,
576 24000, 22050, 16000, 12000, 11025, 8000, 0
577};
578
580 .p.name = "libfdk_aac",
581 CODEC_LONG_NAME("Fraunhofer FDK AAC"),
582 .p.type = AVMEDIA_TYPE_AUDIO,
583 .p.id = AV_CODEC_ID_AAC,
584 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
587 .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE,
588 .priv_data_size = sizeof(AACContext),
591 .flush = aac_encode_flush,
592 .close = aac_encode_close,
594 .p.priv_class = &aac_enc_class,
595 .defaults = aac_encode_defaults,
596 .p.profiles = profiles,
598 .p.wrapper_name = "libfdk",
600};
static av_cold int aac_encode_init(AVCodecContext *avctx)
Definition aacenc.c:1727
static const FFCodecDefault aac_encode_defaults[]
Definition aacenc.c:1925
static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition aacenc.c:1218
const FFCodec ff_libfdk_aac_encoder
av_cold void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
int ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, AVPacket *pkt)
Remove frame(s) from the queue.
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
Libavcodec external API header.
#define s(width, name)
Definition cbs_vp9.c:198
Public libavutil channel layout APIs header.
#define CODEC_SAMPLERATES_ARRAY(array)
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define CODEC_SAMPLEFMTS(...)
#define CODEC_CH_LAYOUTS_ARRAY(array)
common internal and external API header
#define av_clip
Definition common.h:100
#define NULL
Definition coverity.c:32
#define AV_PROFILE_AAC_HE
Definition defs.h:72
#define AV_PROFILE_UNKNOWN
Definition defs.h:65
#define AV_PROFILE_AAC_LOW
Definition defs.h:69
#define AV_PROFILE_AAC_HE_V2
Definition defs.h:73
#define AV_PROFILE_AAC_LD
Definition defs.h:74
#define AV_PROFILE_AAC_ELD
Definition defs.h:75
#define AV_PROFILE_MPEG2_AAC_HE
Definition defs.h:78
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
mode
Use these values in ebur128_init (or'ed).
Definition ebur128.h:83
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition encode.c:62
AVCPBProperties * ff_encode_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
Definition encode.c:1039
#define AV_OPT_FLAG_AUDIO_PARAM
Definition opt.h:356
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition opt.h:351
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
#define AV_CODEC_CAP_ENCODER_FLUSH
This encoder can be flushed using avcodec_flush_buffers().
Definition codec.h:154
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
Definition avcodec.h:213
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition avcodec.h:318
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
Definition codec.h:84
@ AV_CODEC_ID_AAC
Definition codec_id.h:457
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition packet.h:650
#define AV_CHANNEL_LAYOUT_4POINT0
#define AV_CHANNEL_LAYOUT_5POINT1_BACK
#define AV_CHANNEL_LAYOUT_STEREO
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
#define AV_CHANNEL_LAYOUT_6POINT1_BACK
#define AV_CHANNEL_LAYOUT_5POINT0_BACK
#define AV_CHANNEL_LAYOUT_MONO
#define AV_CHANNEL_LAYOUT_SURROUND
#define AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK
#define AV_CHANNEL_LAYOUT_7POINT1
#define AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition samplefmt.h:58
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
#define av_cold
Definition attributes.h:117
static const int aac_sample_rates[]
static const AVChannelLayout aac_ch_layouts[16]
static const char * aac_get_error(AACENC_ERROR err)
static void aac_encode_flush(AVCodecContext *avctx)
static const AVProfile profiles[]
static const AVOption aac_enc_options[]
static int aac_encode_close(AVCodecContext *avctx)
static av_cold int aac_encode_init(AVCodecContext *avctx)
static const AVClass aac_enc_class
static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
#define FFMAX(a, b)
Definition macros.h:47
Memory handling functions.
AVOptions.
#define FF_AAC_PROFILE_OPTS
Definition profiles.h:29
AudioFrameQueue afq
int comp_target_ref
AACENC_MetaData metaDataSetup
HANDLE_AACENCODER handle
This structure describes the bitrate properties of an encoded bitstream.
Definition defs.h:296
int64_t avg_bitrate
Average bitrate of the stream, in bits per second.
Definition defs.h:311
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
Definition defs.h:301
int64_t min_bitrate
Minimum bitrate of the stream, in bits per second.
Definition defs.h:306
An AVChannelLayout holds information about the channel layout of audio data.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
int global_quality
Global quality for codecs which cannot change it per frame.
Definition avcodec.h:1235
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
int profile
profile
Definition avcodec.h:1641
int initial_padding
Audio only.
Definition avcodec.h:1114
int sample_rate
samples per second
Definition avcodec.h:1040
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
int extradata_size
Definition avcodec.h:527
int cutoff
Audio cutoff bandwidth (0 means "automatic")
Definition avcodec.h:1082
int frame_size
Number of samples per channel in an audio frame.
Definition avcodec.h:1068
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:479
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
int flags
A combination of AV_PKT_FLAG values.
Definition packet.h:609
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
AVProfile.
Definition codec.h:167
Definition swscale.c:71
#define av_mallocz(s)
#define av_log(a,...)
static void error(const char *err)