#include <fdk-aac/aacenc_lib.h>
+#include "libavutil/channel_layout.h"
+#include "libavutil/common.h"
+#include "libavutil/opt.h"
#include "avcodec.h"
#include "audio_frame_queue.h"
#include "internal.h"
-#include "libavutil/audioconvert.h"
-#include "libavutil/common.h"
-#include "libavutil/opt.h"
typedef struct AACContext {
const AVClass *class;
int signaling;
int latm;
int header_period;
+ int vbr;
AudioFrameQueue afq;
} AACContext;
{ "explicit_hierarchical", "Explicit hierarchical signaling", 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, "signaling" },
{ "latm", "Output LATM/LOAS encapsulated data", offsetof(AACContext, latm), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
{ "header_period", "StreamMuxConfig and PCE repetition period (in frames)", offsetof(AACContext, header_period), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xffff, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
+ { "vbr", "VBR mode (1-5)", offsetof(AACContext, vbr), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 5, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
{ NULL }
};
if (s->handle)
aacEncClose(&s->handle);
-#if FF_API_OLD_ENCODE_AUDIO
- av_freep(&avctx->coded_frame);
-#endif
av_freep(&avctx->extradata);
ff_af_queue_close(&s->afq);
goto error;
}
- if (avctx->flags & CODEC_FLAG_QSCALE) {
- int mode = avctx->global_quality;
+ if (avctx->flags & CODEC_FLAG_QSCALE || s->vbr) {
+ int mode = s->vbr ? s->vbr : avctx->global_quality;
if (mode < 1 || mode > 5) {
av_log(avctx, AV_LOG_WARNING,
"VBR quality %d out of range, should be 1-5\n", mode);
mode = av_clip(mode, 1, 5);
}
+ av_log(avctx, AV_LOG_WARNING,
+ "Note, the VBR setting is unsupported and only works with "
+ "some parameter combinations\n");
if ((err = aacEncoder_SetParam(s->handle, AACENC_BITRATEMODE,
mode)) != AACENC_OK) {
av_log(avctx, AV_LOG_ERROR, "Unable to set the VBR bitrate mode %d: %s\n",
}
if (avctx->cutoff > 0) {
- if (avctx->cutoff < (avctx->sample_rate + 255) >> 8) {
+ if (avctx->cutoff < (avctx->sample_rate + 255) >> 8 || avctx->cutoff > 20000) {
av_log(avctx, AV_LOG_ERROR, "cutoff valid range is %d-20000\n",
(avctx->sample_rate + 255) >> 8);
goto error;
}
if ((err = aacEncoder_SetParam(s->handle, AACENC_BANDWIDTH,
avctx->cutoff)) != AACENC_OK) {
- av_log(avctx, AV_LOG_ERROR, "Unable to set the encoder bandwith to %d: %s\n",
+ av_log(avctx, AV_LOG_ERROR, "Unable to set the encoder bandwidth to %d: %s\n",
avctx->cutoff, aac_get_error(err));
goto error;
}
goto error;
}
-#if FF_API_OLD_ENCODE_AUDIO
- avctx->coded_frame = avcodec_alloc_frame();
- if (!avctx->coded_frame) {
- ret = AVERROR(ENOMEM);
- goto error;
- }
-#endif
avctx->frame_size = info.frameLength;
avctx->delay = info.encoderDelay;
ff_af_queue_init(avctx, &s->afq);
in_buf.bufElSizes = &in_buffer_element_size;
/* add current frame to the queue */
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
}