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";
100 #if FF_API_OLD_ENCODE_AUDIO
113 AACENC_InfoStruct info = { 0 };
117 int sce = 0, cpe = 0;
119 if ((err = aacEncOpen(&s->
handle, 0, avctx->
channels)) != AACENC_OK) {
128 if ((err = aacEncoder_SetParam(s->
handle, AACENC_AOT, aot)) != AACENC_OK) {
135 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SBR_MODE,
143 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SAMPLERATE,
151 case 1: mode = MODE_1; sce = 1; cpe = 0;
break;
152 case 2: mode = MODE_2; sce = 0; cpe = 1;
break;
153 case 3: mode = MODE_1_2; sce = 1; cpe = 1;
break;
154 case 4: mode = MODE_1_2_1; sce = 2; cpe = 1;
break;
155 case 5: mode = MODE_1_2_2; sce = 1; cpe = 2;
break;
156 case 6: mode = MODE_1_2_2_1; sce = 2; cpe = 2;
break;
159 "Unsupported number of channels %d\n", avctx->
channels);
163 if ((err = aacEncoder_SetParam(s->
handle, AACENC_CHANNELMODE,
164 mode)) != AACENC_OK) {
166 "Unable to set channel mode %d: %s\n", mode,
aac_get_error(err));
170 if ((err = aacEncoder_SetParam(s->
handle, AACENC_CHANNELORDER,
173 "Unable to set wav channel order %d: %s\n",
180 if (mode < 1 || mode > 5) {
182 "VBR quality %d out of range, should be 1-5\n", mode);
183 mode = av_clip(mode, 1, 5);
186 "Note, the VBR setting is unsupported and only works with "
187 "some parameter combinations\n");
188 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BITRATEMODE,
189 mode)) != AACENC_OK) {
206 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BITRATE,
216 if ((err = aacEncoder_SetParam(s->
handle, AACENC_TRANSMUX,
224 if ((err = aacEncoder_SetParam(s->
handle, AACENC_HEADER_PERIOD,
238 if ((err = aacEncoder_SetParam(s->
handle, AACENC_SIGNALING_MODE,
245 if ((err = aacEncoder_SetParam(s->
handle, AACENC_AFTERBURNER,
258 if ((err = aacEncoder_SetParam(s->
handle, AACENC_BANDWIDTH,
259 avctx->
cutoff)) != AACENC_OK) {
272 if ((err = aacEncInfo(s->
handle, &info)) != AACENC_OK) {
278 #if FF_API_OLD_ENCODE_AUDIO
286 avctx->
delay = info.encoderDelay;
298 memcpy(avctx->
extradata, info.confBuf, info.confSize);
307 const AVFrame *frame,
int *got_packet_ptr)
310 AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
311 AACENC_InArgs in_args = { 0 };
312 AACENC_OutArgs out_args = { 0 };
313 int in_buffer_identifier = IN_AUDIO_DATA;
314 int in_buffer_size, in_buffer_element_size;
315 int out_buffer_identifier = OUT_BITSTREAM_DATA;
316 int out_buffer_size, out_buffer_element_size;
317 void *in_ptr, *out_ptr;
323 in_args.numInSamples = -1;
325 in_ptr = frame->
data[0];
327 in_buffer_element_size = 2;
331 in_buf.bufs = &in_ptr;
332 in_buf.bufferIdentifiers = &in_buffer_identifier;
333 in_buf.bufSizes = &in_buffer_size;
334 in_buf.bufElSizes = &in_buffer_element_size;
347 out_ptr = avpkt->
data;
348 out_buffer_size = avpkt->
size;
349 out_buffer_element_size = 1;
351 out_buf.bufs = &out_ptr;
352 out_buf.bufferIdentifiers = &out_buffer_identifier;
353 out_buf.bufSizes = &out_buffer_size;
354 out_buf.bufElSizes = &out_buffer_element_size;
356 if ((err = aacEncEncode(s->
handle, &in_buf, &out_buf, &in_args,
357 &out_args)) != AACENC_OK) {
358 if (!frame && err == AACENC_ENCODE_EOF)
365 if (!out_args.numOutBytes)
372 avpkt->
size = out_args.numOutBytes;
402 96000, 88200, 64000, 48000, 44100, 32000,
403 24000, 22050, 16000, 12000, 11025, 8000, 0
407 .
name =
"libfdk_aac",
This structure describes decoded (raw) audio or video data.
static const int aac_sample_rates[]
#define AV_CH_LAYOUT_SURROUND
AVFrame * coded_frame
the picture in the bitstream
#define AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_STEREO
#define AV_OPT_FLAG_AUDIO_PARAM
struct AACContext AACContext
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
#define FF_PROFILE_AAC_HE_V2
static int aac_encode_close(AVCodecContext *avctx)
AVCodec ff_libfdk_aac_encoder
#define CODEC_FLAG_QSCALE
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static const AVClass aac_enc_class
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
static int init(AVCodecParserContext *s)
#define FF_PROFILE_AAC_LD
static av_cold int aac_encode_init(AVCodecContext *avctx)
#define CODEC_CAP_SMALL_LAST_FRAME
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
AVFrame * avcodec_alloc_frame(void)
Allocate an AVFrame and set its fields to default values.
int bit_rate
the average bitrate
audio channel layout utility functions
int ff_alloc_packet(AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
#define AV_CH_LAYOUT_5POINT1_BACK
#define AV_OPT_FLAG_ENCODING_PARAM
#define FF_PROFILE_AAC_HE
int frame_size
Number of samples per channel in an audio frame.
int sample_rate
samples per second
main external API structure.
static const AVCodecDefault aac_encode_defaults[]
static void close(AVCodecParserContext *s)
Describe the class of an AVClass context structure.
static const AVProfile profiles[]
#define FF_INPUT_BUFFER_PADDING_SIZE
#define AV_CH_LAYOUT_5POINT0_BACK
#define CODEC_FLAG_GLOBAL_HEADER
int global_quality
Global quality for codecs which cannot change it per frame.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define FF_PROFILE_AAC_LOW
common internal api header.
common internal and external API header
AVSampleFormat
Audio Sample Formats.
static const AVOption aac_enc_options[]
static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int cutoff
Audio cutoff bandwidth (0 means "automatic")
void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
#define FF_PROFILE_AAC_ELD
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int *duration)
Remove frame(s) from the queue.
int channels
number of audio channels
static const uint64_t aac_channel_layout[]
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static const char * aac_get_error(AACENC_ERROR err)
#define FF_PROFILE_UNKNOWN
if(!(ptr_align%ac->ptr_align)&&samples_align >=aligned_len)