20 #include <fdk-aac/aacenc_lib.h>
29 #ifdef AACENCODER_LIB_VL0
30 #define FDKENC_VER_AT_LEAST(vl0, vl1) \
31 ((AACENCODER_LIB_VL0 > vl0) || \
32 (AACENCODER_LIB_VL0 == vl0 && AACENCODER_LIB_VL1 >= vl1))
34 #define FDKENC_VER_AT_LEAST(vl0, vl1) 0
53 {
"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 },
54 #if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
57 {
"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" },
58 {
"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" },
60 {
"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" },
80 case AACENC_INVALID_HANDLE:
81 return "Invalid handle";
82 case AACENC_MEMORY_ERROR:
83 return "Memory allocation error";
84 case AACENC_UNSUPPORTED_PARAMETER:
85 return "Unsupported parameter";
86 case AACENC_INVALID_CONFIG:
87 return "Invalid config";
88 case AACENC_INIT_ERROR:
89 return "Initialization error";
90 case AACENC_INIT_AAC_ERROR:
91 return "AAC library initialization error";
92 case AACENC_INIT_SBR_ERROR:
93 return "SBR library initialization error";
94 case AACENC_INIT_TP_ERROR:
95 return "Transport library initialization error";
96 case AACENC_INIT_META_ERROR:
97 return "Metadata library initialization error";
98 case AACENC_ENCODE_ERROR:
99 return "Encoding error";
100 case AACENC_ENCODE_EOF:
101 return "End of file";
103 return "Unknown error";
112 aacEncClose(&
s->handle);
123 AACENC_InfoStruct
info = { 0 };
127 int sce = 0, cpe = 0;
129 if ((err = aacEncOpen(&
s->handle, 0, avctx->
channels)) != AACENC_OK) {
138 if ((err = aacEncoder_SetParam(
s->handle, AACENC_AOT, aot)) != AACENC_OK) {
145 if ((err = aacEncoder_SetParam(
s->handle, AACENC_SBR_MODE,
153 if ((err = aacEncoder_SetParam(
s->handle, AACENC_SAMPLERATE,
161 case 1:
mode = MODE_1; sce = 1; cpe = 0;
break;
163 #if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
166 if ((err = aacEncoder_SetParam(
s->handle, AACENC_CHANNELMODE,
167 128)) != AACENC_OK) {
184 case 3:
mode = MODE_1_2; sce = 1; cpe = 1;
break;
185 case 4:
mode = MODE_1_2_1; sce = 2; cpe = 1;
break;
186 case 5:
mode = MODE_1_2_2; sce = 1; cpe = 2;
break;
187 case 6:
mode = MODE_1_2_2_1; sce = 2; cpe = 2;
break;
190 #if FDKENC_VER_AT_LEAST(3, 4) // 3.4.12
195 mode = MODE_7_1_REAR_SURROUND;
198 mode = MODE_7_1_FRONT_CENTER;
204 "Unsupported number of channels %d\n", avctx->
channels);
208 if ((err = aacEncoder_SetParam(
s->handle, AACENC_CHANNELMODE,
209 mode)) != AACENC_OK) {
215 if ((err = aacEncoder_SetParam(
s->handle, AACENC_CHANNELORDER,
218 "Unable to set wav channel order %d: %s\n",
227 "VBR quality %d out of range, should be 1-5\n",
mode);
231 "Note, the VBR setting is unsupported and only works with "
232 "some parameter combinations\n");
233 if ((err = aacEncoder_SetParam(
s->handle, AACENC_BITRATEMODE,
234 mode)) != AACENC_OK) {
252 if ((err = aacEncoder_SetParam(
s->handle, AACENC_BITRATE,
262 if ((err = aacEncoder_SetParam(
s->handle, AACENC_TRANSMUX,
264 s->latm ? TT_MP4_LOAS : TT_MP4_ADTS)) != AACENC_OK) {
270 if (
s->latm &&
s->header_period) {
271 if ((err = aacEncoder_SetParam(
s->handle, AACENC_HEADER_PERIOD,
272 s->header_period)) != AACENC_OK) {
282 if (
s->signaling < 0)
285 if ((err = aacEncoder_SetParam(
s->handle, AACENC_SIGNALING_MODE,
286 s->signaling)) != AACENC_OK) {
292 if ((err = aacEncoder_SetParam(
s->handle, AACENC_AFTERBURNER,
293 s->afterburner)) != AACENC_OK) {
305 if ((err = aacEncoder_SetParam(
s->handle, AACENC_BANDWIDTH,
306 avctx->
cutoff)) != AACENC_OK) {
319 if ((err = aacEncInfo(
s->handle, &
info)) != AACENC_OK) {
326 #if FDKENC_VER_AT_LEAST(4, 0) // 4.0.0
354 AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
355 AACENC_InArgs in_args = { 0 };
356 AACENC_OutArgs out_args = { 0 };
357 int in_buffer_identifier = IN_AUDIO_DATA;
358 int in_buffer_size, in_buffer_element_size;
359 int out_buffer_identifier = OUT_BITSTREAM_DATA;
360 int out_buffer_size, out_buffer_element_size;
361 void *in_ptr, *out_ptr;
373 in_args.numInSamples = -1;
375 in_ptr =
frame->data[0];
385 in_buffer_element_size = 2;
387 in_buf.bufs = &in_ptr;
388 in_buf.bufferIdentifiers = &in_buffer_identifier;
389 in_buf.bufSizes = &in_buffer_size;
390 in_buf.bufElSizes = &in_buffer_element_size;
396 out_ptr = avpkt->
data;
397 out_buffer_size = avpkt->
size;
398 out_buffer_element_size = 1;
400 out_buf.bufs = &out_ptr;
401 out_buf.bufferIdentifiers = &out_buffer_identifier;
402 out_buf.bufSizes = &out_buffer_size;
403 out_buf.bufElSizes = &out_buffer_element_size;
405 if ((err = aacEncEncode(
s->handle, &in_buf, &out_buf, &in_args,
406 &out_args)) != AACENC_OK) {
407 if (!
frame && err == AACENC_ENCODE_EOF)
414 if (!out_args.numOutBytes)
421 avpkt->
size = out_args.numOutBytes;
447 #if FDKENC_VER_AT_LEAST(3, 4) // 3.4.12
455 96000, 88200, 64000, 48000, 44100, 32000,
456 24000, 22050, 16000, 12000, 11025, 8000, 0
460 .
name =
"libfdk_aac",
476 .wrapper_name =
"libfdk",