22 #include <fdk-aac/aacenc_lib.h>
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" },
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" },
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:
90 return "Unknown error";
110 AACENC_InfoStruct info = { 0 };
114 int sce = 0, cpe = 0;
116 if ((err = aacEncOpen(&s->
handle, 0, avctx->
channels)) != AACENC_OK) {
125 if ((err = aacEncoder_SetParam(s->
handle, AACENC_AOT, aot)) != AACENC_OK) {
132 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SBR_MODE,
140 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SAMPLERATE,
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;
156 #ifdef AACENCODER_LIB_VL0
161 mode = MODE_7_1_REAR_SURROUND;
164 mode = MODE_7_1_FRONT_CENTER;
170 "Unsupported number of channels %d\n", avctx->
channels);
174 if ((err = aacEncoder_SetParam(s->
handle, AACENC_CHANNELMODE,
175 mode)) != AACENC_OK) {
177 "Unable to set channel mode %d: %s\n", mode,
aac_get_error(err));
181 if ((err = aacEncoder_SetParam(s->
handle, AACENC_CHANNELORDER,
184 "Unable to set wav channel order %d: %s\n",
193 "VBR quality %d out of range, should be 1-5\n", mode);
194 mode = av_clip(mode, 1, 5);
197 "Note, the VBR setting is unsupported and only works with "
198 "some parameter combinations\n");
199 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BITRATEMODE,
200 mode)) != AACENC_OK) {
218 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BITRATE,
228 if ((err = aacEncoder_SetParam(s->
handle, AACENC_TRANSMUX,
236 if ((err = aacEncoder_SetParam(s->
handle, AACENC_HEADER_PERIOD,
250 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SIGNALING_MODE,
257 if ((err = aacEncoder_SetParam(s->
handle, AACENC_AFTERBURNER,
270 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BANDWIDTH,
271 avctx->
cutoff)) != AACENC_OK) {
278 if ((err = aacEncEncode(s->
handle, NULL, NULL, NULL, NULL)) != AACENC_OK) {
284 if ((err = aacEncInfo(s->
handle, &info)) != AACENC_OK) {
291 avctx->
delay = info.encoderDelay;
303 memcpy(avctx->
extradata, info.confBuf, info.confSize);
315 AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
316 AACENC_InArgs in_args = { 0 };
317 AACENC_OutArgs out_args = { 0 };
318 int in_buffer_identifier = IN_AUDIO_DATA;
319 int in_buffer_size, in_buffer_element_size;
320 int out_buffer_identifier = OUT_BITSTREAM_DATA;
321 int out_buffer_size, out_buffer_element_size;
322 void *in_ptr, *out_ptr;
328 in_args.numInSamples = -1;
330 in_ptr = frame->
data[0];
332 in_buffer_element_size = 2;
336 in_buf.bufs = &in_ptr;
337 in_buf.bufferIdentifiers = &in_buffer_identifier;
338 in_buf.bufSizes = &in_buffer_size;
339 in_buf.bufElSizes = &in_buffer_element_size;
350 out_ptr = avpkt->
data;
351 out_buffer_size = avpkt->
size;
352 out_buffer_element_size = 1;
354 out_buf.bufs = &out_ptr;
355 out_buf.bufferIdentifiers = &out_buffer_identifier;
356 out_buf.bufSizes = &out_buffer_size;
357 out_buf.bufElSizes = &out_buffer_element_size;
359 if ((err = aacEncEncode(s->
handle, &in_buf, &out_buf, &in_args,
360 &out_args)) != AACENC_OK) {
361 if (!frame && err == AACENC_ENCODE_EOF)
368 if (!out_args.numOutBytes)
375 avpkt->
size = out_args.numOutBytes;
401 #ifdef AACENCODER_LIB_VL0
409 96000, 88200, 64000, 48000, 44100, 32000,
410 24000, 22050, 16000, 12000, 11025, 8000, 0
414 .
name =
"libfdk_aac",