20 #include <fdk-aac/aacenc_lib.h>
30 #ifdef AACENCODER_LIB_VL0
31 #define FDKENC_VER_AT_LEAST(vl0, vl1) \
32 ((AACENCODER_LIB_VL0 > vl0) || \
33 (AACENCODER_LIB_VL0 == vl0 && AACENCODER_LIB_VL1 >= vl1))
35 #define FDKENC_VER_AT_LEAST(vl0, vl1) 0
54 {
"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 },
55 #if FDKENC_VER_AT_LEAST(4, 0)
58 {
"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" },
59 {
"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" },
61 {
"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" },
82 case AACENC_INVALID_HANDLE:
83 return "Invalid handle";
84 case AACENC_MEMORY_ERROR:
85 return "Memory allocation error";
86 case AACENC_UNSUPPORTED_PARAMETER:
87 return "Unsupported parameter";
88 case AACENC_INVALID_CONFIG:
89 return "Invalid config";
90 case AACENC_INIT_ERROR:
91 return "Initialization error";
92 case AACENC_INIT_AAC_ERROR:
93 return "AAC library initialization error";
94 case AACENC_INIT_SBR_ERROR:
95 return "SBR library initialization error";
96 case AACENC_INIT_TP_ERROR:
97 return "Transport library initialization error";
98 case AACENC_INIT_META_ERROR:
99 return "Metadata library initialization error";
100 case AACENC_ENCODE_ERROR:
101 return "Encoding error";
102 case AACENC_ENCODE_EOF:
103 return "End of file";
105 return "Unknown error";
114 aacEncClose(&
s->handle);
125 AACENC_InfoStruct info = { 0 };
129 int sce = 0, cpe = 0;
131 if ((err = aacEncOpen(&
s->handle, 0, avctx->
channels)) != AACENC_OK) {
140 if ((err = aacEncoder_SetParam(
s->handle, AACENC_AOT, aot)) != AACENC_OK) {
147 if ((err = aacEncoder_SetParam(
s->handle, AACENC_SBR_MODE,
155 if ((err = aacEncoder_SetParam(
s->handle, AACENC_SAMPLERATE,
163 case 1:
mode = MODE_1; sce = 1; cpe = 0;
break;
165 #if FDKENC_VER_AT_LEAST(4, 0)
168 if ((err = aacEncoder_SetParam(
s->handle, AACENC_CHANNELMODE,
169 128)) != AACENC_OK) {
186 case 3:
mode = MODE_1_2; sce = 1; cpe = 1;
break;
187 case 4:
mode = MODE_1_2_1; sce = 2; cpe = 1;
break;
188 case 5:
mode = MODE_1_2_2; sce = 1; cpe = 2;
break;
189 case 6:
mode = MODE_1_2_2_1; sce = 2; cpe = 2;
break;
192 #if FDKENC_VER_AT_LEAST(3, 4)
197 mode = MODE_7_1_REAR_SURROUND;
200 mode = MODE_7_1_FRONT_CENTER;
206 "Unsupported number of channels %d\n", avctx->
channels);
210 if ((err = aacEncoder_SetParam(
s->handle, AACENC_CHANNELMODE,
211 mode)) != AACENC_OK) {
217 if ((err = aacEncoder_SetParam(
s->handle, AACENC_CHANNELORDER,
220 "Unable to set wav channel order %d: %s\n",
229 "VBR quality %d out of range, should be 1-5\n",
mode);
233 "Note, the VBR setting is unsupported and only works with "
234 "some parameter combinations\n");
235 if ((err = aacEncoder_SetParam(
s->handle, AACENC_BITRATEMODE,
236 mode)) != AACENC_OK) {
254 if ((err = aacEncoder_SetParam(
s->handle, AACENC_BITRATE,
264 if ((err = aacEncoder_SetParam(
s->handle, AACENC_TRANSMUX,
266 s->latm ? TT_MP4_LOAS : TT_MP4_ADTS)) != AACENC_OK) {
272 if (
s->latm &&
s->header_period) {
273 if ((err = aacEncoder_SetParam(
s->handle, AACENC_HEADER_PERIOD,
274 s->header_period)) != AACENC_OK) {
284 if (
s->signaling < 0)
287 if ((err = aacEncoder_SetParam(
s->handle, AACENC_SIGNALING_MODE,
288 s->signaling)) != AACENC_OK) {
294 if ((err = aacEncoder_SetParam(
s->handle, AACENC_AFTERBURNER,
295 s->afterburner)) != AACENC_OK) {
307 if ((err = aacEncoder_SetParam(
s->handle, AACENC_BANDWIDTH,
308 avctx->
cutoff)) != AACENC_OK) {
321 if ((err = aacEncInfo(
s->handle, &info)) != AACENC_OK) {
328 #if FDKENC_VER_AT_LEAST(4, 0)
344 memcpy(avctx->
extradata, info.confBuf, info.confSize);
356 AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
357 AACENC_InArgs in_args = { 0 };
358 AACENC_OutArgs out_args = { 0 };
359 int in_buffer_identifier = IN_AUDIO_DATA;
360 int in_buffer_size, in_buffer_element_size;
361 int out_buffer_identifier = OUT_BITSTREAM_DATA;
362 int out_buffer_size, out_buffer_element_size;
363 void *in_ptr, *out_ptr;
375 in_args.numInSamples = -1;
387 in_buffer_element_size = 2;
389 in_buf.bufs = &in_ptr;
390 in_buf.bufferIdentifiers = &in_buffer_identifier;
391 in_buf.bufSizes = &in_buffer_size;
392 in_buf.bufElSizes = &in_buffer_element_size;
398 out_ptr = avpkt->
data;
399 out_buffer_size = avpkt->
size;
400 out_buffer_element_size = 1;
402 out_buf.bufs = &out_ptr;
403 out_buf.bufferIdentifiers = &out_buffer_identifier;
404 out_buf.bufSizes = &out_buffer_size;
405 out_buf.bufElSizes = &out_buffer_element_size;
407 if ((err = aacEncEncode(
s->handle, &in_buf, &out_buf, &in_args,
408 &out_args)) != AACENC_OK) {
409 if (!
frame && err == AACENC_ENCODE_EOF)
416 if (!out_args.numOutBytes)
423 avpkt->
size = out_args.numOutBytes;
449 #if FDKENC_VER_AT_LEAST(3, 4)
457 96000, 88200, 64000, 48000, 44100, 32000,
458 24000, 22050, 16000, 12000, 11025, 8000, 0
462 .
name =
"libfdk_aac",
478 .wrapper_name =
"libfdk",
static enum AVSampleFormat sample_fmts[]
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
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 FF_PROFILE_AAC_LD
#define FF_PROFILE_UNKNOWN
#define FF_PROFILE_AAC_HE
#define FF_PROFILE_AAC_HE_V2
#define FF_PROFILE_AAC_LOW
#define FF_PROFILE_MPEG2_AAC_HE
#define FF_PROFILE_AAC_ELD
static av_cold int init(AVCodecContext *avctx)
audio channel layout utility functions
common internal and external API header
mode
Use these values in ebur128_init (or'ed).
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
#define AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_7POINT1
#define AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_SURROUND
#define AV_CH_LAYOUT_7POINT1_WIDE_BACK
#define AV_CH_LAYOUT_5POINT0_BACK
#define AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_5POINT1_BACK
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
AVSampleFormat
Audio sample formats.
@ AV_SAMPLE_FMT_S16
signed 16 bits
#define LIBAVUTIL_VERSION_INT
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static const int aac_sample_rates[]
static const AVCodecDefault aac_encode_defaults[]
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 char * aac_get_error(AACENC_ERROR err)
static const AVClass aac_enc_class
AVCodec ff_libfdk_aac_encoder
static const uint64_t aac_channel_layout[]
static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
#define AV_OPT_FLAG_AUDIO_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
#define FF_AAC_PROFILE_OPTS
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
main external API structure.
int global_quality
Global quality for codecs which cannot change it per frame.
int64_t bit_rate
the average bitrate
int initial_padding
Audio only.
int sample_rate
samples per second
int flags
AV_CODEC_FLAG_*.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int channels
number of audio channels
int cutoff
Audio cutoff bandwidth (0 means "automatic")
uint64_t channel_layout
Audio channel layout.
int frame_size
Number of samples per channel in an audio frame.
const char * name
Name of the codec implementation.
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This structure stores compressed data.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static void error(const char *err)