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
28
38
41
44 {
"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 },
45 {
"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" },
46 {
"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" },
48 {
"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" },
53 { NULL }
54 };
55
58 };
59
61 {
62 switch (err) {
63 case AACENC_OK:
64 return "No error";
65 case AACENC_INVALID_HANDLE:
66 return "Invalid handle";
67 case AACENC_MEMORY_ERROR:
68 return "Memory allocation error";
69 case AACENC_UNSUPPORTED_PARAMETER:
70 return "Unsupported parameter";
71 case AACENC_INVALID_CONFIG:
72 return "Invalid config";
73 case AACENC_INIT_ERROR:
74 return "Initialization error";
75 case AACENC_INIT_AAC_ERROR:
76 return "AAC library initialization error";
77 case AACENC_INIT_SBR_ERROR:
78 return "SBR library initialization error";
79 case AACENC_INIT_TP_ERROR:
80 return "Transport library initialization error";
81 case AACENC_INIT_META_ERROR:
82 return "Metadata library initialization error";
83 case AACENC_ENCODE_ERROR:
84 return "Encoding error";
85 case AACENC_ENCODE_EOF:
86 return "End of file";
87 default:
88 return "Unknown error";
89 }
90 }
91
93 {
95
100
101 return 0;
102 }
103
105 {
108 AACENC_InfoStruct info = { 0 };
110 AACENC_ERROR err;
112 int sce = 0, cpe = 0;
113
114 if ((err = aacEncOpen(&s->
handle, 0, avctx->
channels)) != AACENC_OK) {
117 goto error;
118 }
119
122
123 if ((err = aacEncoder_SetParam(s->
handle, AACENC_AOT, aot)) != AACENC_OK) {
126 goto error;
127 }
128
130 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SBR_MODE,
131 1)) != AACENC_OK) {
134 goto error;
135 }
136 }
137
138 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SAMPLERATE,
142 goto error;
143 }
144
146 case 1: mode = MODE_1; sce = 1; cpe = 0; break;
147 case 2: mode = MODE_2; sce = 0; cpe = 1; break;
148 case 3: mode = MODE_1_2; sce = 1; cpe = 1; break;
149 case 4: mode = MODE_1_2_1; sce = 2; cpe = 1; break;
150 case 5: mode = MODE_1_2_2; sce = 1; cpe = 2; break;
151 case 6: mode = MODE_1_2_2_1; sce = 2; cpe = 2; break;
152 /* The version macro is introduced the same time as the 7.1 support, so this
153 should suffice. */
154 #ifdef AACENCODER_LIB_VL0
155 case 8:
156 sce = 2;
157 cpe = 3;
159 mode = MODE_7_1_REAR_SURROUND;
160 } else {
161 // MODE_1_2_2_2_1 and MODE_7_1_FRONT_CENTER use the same channel layout
162 mode = MODE_7_1_FRONT_CENTER;
163 }
164 break;
165 #endif
166 default:
168 "Unsupported number of channels %d\n", avctx->
channels);
169 goto error;
170 }
171
172 if ((err = aacEncoder_SetParam(s->
handle, AACENC_CHANNELMODE,
173 mode)) != AACENC_OK) {
175 "Unable to set channel mode %d: %s\n", mode,
aac_get_error(err));
176 goto error;
177 }
178
179 if ((err = aacEncoder_SetParam(s->
handle, AACENC_CHANNELORDER,
180 1)) != AACENC_OK) {
182 "Unable to set wav channel order %d: %s\n",
184 goto error;
185 }
186
191 "VBR quality %d out of range, should be 1-5\n", mode);
192 mode = av_clip(mode, 1, 5);
193 }
195 "Note, the VBR setting is unsupported and only works with "
196 "some parameter combinations\n");
197 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BITRATEMODE,
198 mode)) != AACENC_OK) {
201 goto error;
202 }
203 } else {
206 sce = 1;
207 cpe = 0;
208 }
215 }
216 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BITRATE,
220 goto error;
221 }
222 }
223
224 /* Choose bitstream format - if global header is requested, use
225 * raw access units, otherwise use ADTS. */
226 if ((err = aacEncoder_SetParam(s->
handle, AACENC_TRANSMUX,
230 goto error;
231 }
232
234 if ((err = aacEncoder_SetParam(s->
handle, AACENC_HEADER_PERIOD,
238 goto error;
239 }
240 }
241
242 /* If no signaling mode is chosen, use explicit hierarchical signaling
243 * if using mp4 mode (raw access units, with global header) and
244 * implicit signaling if using ADTS. */
247
248 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SIGNALING_MODE,
252 goto error;
253 }
254
255 if ((err = aacEncoder_SetParam(s->
handle, AACENC_AFTERBURNER,
259 goto error;
260 }
261
266 goto error;
267 }
268 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BANDWIDTH,
269 avctx->
cutoff)) != AACENC_OK) {
272 goto error;
273 }
274 }
275
276 if ((err = aacEncEncode(s->
handle, NULL, NULL, NULL, NULL)) != AACENC_OK) {
280 }
281
282 if ((err = aacEncInfo(s->
handle, &info)) != AACENC_OK) {
285 goto error;
286 }
287
289 avctx->
delay = info.encoderDelay;
291
298 goto error;
299 }
300
301 memcpy(avctx->
extradata, info.confBuf, info.confSize);
302 }
303 return 0;
304 error:
307 }
308
311 {
313 AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
314 AACENC_InArgs in_args = { 0 };
315 AACENC_OutArgs out_args = { 0 };
316 int in_buffer_identifier = IN_AUDIO_DATA;
317 int in_buffer_size, in_buffer_element_size;
318 int out_buffer_identifier = OUT_BITSTREAM_DATA;
319 int out_buffer_size, out_buffer_element_size;
320 void *in_ptr, *out_ptr;
322 AACENC_ERROR err;
323
324 /* handle end-of-stream small frame and flushing */
325 if (!frame) {
326 in_args.numInSamples = -1;
327 } else {
328 in_ptr = frame->
data[0];
330 in_buffer_element_size = 2;
331
333 in_buf.numBufs = 1;
334 in_buf.bufs = &in_ptr;
335 in_buf.bufferIdentifiers = &in_buffer_identifier;
336 in_buf.bufSizes = &in_buffer_size;
337 in_buf.bufElSizes = &in_buffer_element_size;
338
339 /* add current frame to the queue */
342 }
343
344 /* The maximum packet size is 6144 bits aka 768 bytes per channel. */
347
348 out_ptr = avpkt->
data;
349 out_buffer_size = avpkt->
size;
350 out_buffer_element_size = 1;
351 out_buf.numBufs = 1;
352 out_buf.bufs = &out_ptr;
353 out_buf.bufferIdentifiers = &out_buffer_identifier;
354 out_buf.bufSizes = &out_buffer_size;
355 out_buf.bufElSizes = &out_buffer_element_size;
356
357 if ((err = aacEncEncode(s->
handle, &in_buf, &out_buf, &in_args,
358 &out_args)) != AACENC_OK) {
359 if (!frame && err == AACENC_ENCODE_EOF)
360 return 0;
364 }
365
366 if (!out_args.numOutBytes)
367 return 0;
368
369 /* Get the next frame pts & duration */
372
373 avpkt->
size = out_args.numOutBytes;
374 *got_packet_ptr = 1;
375 return 0;
376 }
377
385 };
386
388 { "b", "0" },
389 { NULL }
390 };
391
399 #ifdef AACENCODER_LIB_VL0
402 #endif
403 0,
404 };
405
407 96000, 88200, 64000, 48000, 44100, 32000,
408 24000, 22050, 16000, 12000, 11025, 8000, 0
409 };
410
412 .
name =
"libfdk_aac",
428 };