23 #include <AudioToolbox/AudioToolbox.h>
25 #define FF_BUFQUEUE_SIZE 256
60 return kAudioFormatMPEG4AAC;
62 return kAudioFormatMPEG4AAC_HE;
64 return kAudioFormatMPEG4AAC_HE_V2;
66 return kAudioFormatMPEG4AAC_LD;
68 return kAudioFormatMPEG4AAC_ELD;
71 return kAudioFormatAppleIMA4;
73 return kAudioFormatAppleLossless;
75 return kAudioFormatiLBC;
77 return kAudioFormatALaw;
79 return kAudioFormatULaw;
89 UInt32
size =
sizeof(unsigned);
90 AudioConverterPrimeInfo prime_info;
91 AudioStreamBasicDescription out_format;
94 kAudioConverterPropertyMaximumOutputPacketSize,
100 size =
sizeof(prime_info);
102 if (!AudioConverterGetProperty(at->
converter,
103 kAudioConverterPrimeInfo,
104 &size, &prime_info)) {
108 size =
sizeof(out_format);
109 if (!AudioConverterGetProperty(at->
converter,
110 kAudioConverterCurrentOutputStreamDescription,
111 &size, &out_format)) {
112 if (out_format.mFramesPerPacket)
113 avctx->
frame_size = out_format.mFramesPerPacket;
130 *tag = bytestream2_get_byte(gb);
132 int c = bytestream2_get_byte(gb);
133 len = (len << 7) | (c & 0x7f);
147 return avctx->
bit_rate <= 14000 ? 30 : 20;
154 uint64_t
map = 1 << channel;
172 return kAudioChannelLabel_LFE2;
181 layout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions;
182 layout->mNumberChannelDescriptions =
count;
183 for (i = 0; i <
count; i++) {
185 while (!(in_layout & (1 << c)) && c < 64)
190 layout->mChannelDescriptions[i].mChannelLabel = label;
202 return kAudioChannelLayoutTag_Mono;
204 return kAudioChannelLayoutTag_Stereo;
206 return kAudioChannelLayoutTag_AAC_Quadraphonic;
208 return kAudioChannelLayoutTag_AAC_Octagonal;
210 return kAudioChannelLayoutTag_AAC_3_0;
212 return kAudioChannelLayoutTag_AAC_4_0;
214 return kAudioChannelLayoutTag_AAC_5_0;
216 return kAudioChannelLayoutTag_AAC_5_1;
218 return kAudioChannelLayoutTag_AAC_6_0;
220 return kAudioChannelLayoutTag_AAC_6_1;
222 return kAudioChannelLayoutTag_AAC_7_0;
224 return kAudioChannelLayoutTag_AAC_7_1;
226 return kAudioChannelLayoutTag_MPEG_7_1_C;
237 AudioStreamBasicDescription in_format = {
239 .mFormatID = kAudioFormatLinearPCM,
243 : kAudioFormatFlagIsSignedInteger)
244 | kAudioFormatFlagIsPacked,
246 .mFramesPerPacket = 1,
248 .mChannelsPerFrame = avctx->
channels,
251 AudioStreamBasicDescription out_format = {
254 .mChannelsPerFrame = in_format.mChannelsPerFrame,
256 UInt32 layout_size =
sizeof(AudioChannelLayout) +
257 sizeof(AudioChannelDescription) * avctx->
channels;
258 AudioChannelLayout *channel_layout =
av_malloc(layout_size);
265 out_format.mFramesPerPacket = 8000 * mode / 1000;
266 out_format.mBytesPerPacket = (mode == 20 ? 38 : 50);
269 status = AudioConverterNew(&in_format, &out_format, &at->
converter);
286 if (AudioConverterSetProperty(at->
converter, kAudioConverterInputChannelLayout,
287 layout_size, channel_layout)) {
295 channel_layout->mChannelLayoutTag =
tag;
296 channel_layout->mNumberChannelDescriptions = 0;
299 if (AudioConverterSetProperty(at->
converter, kAudioConverterOutputChannelLayout,
300 layout_size, channel_layout)) {
309 kAudioConverterPropertyBitDepthHint,
313 #if !TARGET_OS_IPHONE
316 kAudioCodecBitRateControlMode_Variable :
317 kAudioCodecBitRateControlMode_Constant;
319 AudioConverterSetProperty(at->
converter, kAudioCodecPropertyBitRateControlMode,
322 if (at->
mode == kAudioCodecBitRateControlMode_Variable) {
324 if (q < 0 || q > 14) {
326 "VBR quality %d out of range, should be 0-14\n", q);
327 q = av_clip(q, 0, 14);
330 AudioConverterSetProperty(at->
converter, kAudioCodecPropertySoundQualityForVBR,
337 status = AudioConverterGetPropertyInfo(at->
converter,
338 kAudioConverterApplicableEncodeBitRates,
340 if (!status && size) {
341 UInt32 new_rate = rate;
344 AudioValueRange *ranges =
av_malloc(size);
348 kAudioConverterApplicableEncodeBitRates,
350 count = size /
sizeof(AudioValueRange);
351 for (i = 0; i <
count; i++) {
352 AudioValueRange *range = &ranges[i];
353 if (rate >= range->mMinimum && rate <= range->mMaximum) {
356 }
else if (rate > range->mMaximum) {
357 new_rate = range->mMaximum;
359 new_rate = range->mMinimum;
363 if (new_rate != rate) {
365 "Bitrate %u not allowed; changing to %u\n", rate, new_rate);
370 AudioConverterSetProperty(at->
converter, kAudioConverterEncodeBitRate,
371 sizeof(rate), &rate);
375 AudioConverterSetProperty(at->
converter, kAudioConverterCodecQuality,
378 if (!AudioConverterGetPropertyInfo(at->
converter, kAudioConverterCompressionMagicCookie,
394 status = AudioConverterGetProperty(at->
converter,
395 kAudioConverterCompressionMagicCookie,
396 &extradata_size, extradata);
411 memmove(extradata, gb.
buffer, len);
418 flags = bytestream2_get_byte(&gb);
434 #if !TARGET_OS_IPHONE && defined(__MAC_10_9)
435 if (at->
mode == kAudioCodecBitRateControlMode_Variable && avctx->
rc_max_rate) {
438 AudioConverterSetProperty(at->
converter, kAudioCodecPropertyPacketSizeLimitForVBR,
439 sizeof(max_size), &max_size);
449 AudioBufferList *
data,
450 AudioStreamPacketDescription **packets,
469 data->mNumberBuffers = 1;
470 data->mBuffers[0].mNumberChannels = avctx->
channels;
471 data->mBuffers[0].mDataByteSize = frame->
nb_samples *
474 data->mBuffers[0].mData = frame->
data[0];
489 AudioBufferList out_buffers = {
498 AudioStreamPacketDescription out_pkt_desc = {0};
529 out_buffers.mBuffers[0].mData = avpkt->
data;
534 got_packet_ptr, &out_buffers,
539 if ((!ret || ret == 1) && *got_packet_ptr) {
540 avpkt->
size = out_buffers.mBuffers[0].mDataByteSize;
542 out_pkt_desc.mVariableFramesInPacket :
546 }
else if (ret && ret != 1) {
580 #define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
582 #if !TARGET_OS_IPHONE
583 {
"aac_at_mode",
"ratecontrol mode", offsetof(
ATDecodeContext,
mode),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, kAudioCodecBitRateControlMode_Variable,
AE,
"mode"},
584 {
"auto",
"VBR if global quality is given; CBR otherwise", 0,
AV_OPT_TYPE_CONST, {.i64 = -1}, INT_MIN, INT_MAX,
AE,
"mode"},
585 {
"cbr",
"constant bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = kAudioCodecBitRateControlMode_Constant}, INT_MIN, INT_MAX,
AE,
"mode"},
586 {
"abr",
"long-term average bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = kAudioCodecBitRateControlMode_LongTermAverage}, INT_MIN, INT_MAX,
AE,
"mode"},
587 {
"cvbr",
"constrained variable bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = kAudioCodecBitRateControlMode_VariableConstrained}, INT_MIN, INT_MAX,
AE,
"mode"},
588 {
"vbr" ,
"variable bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = kAudioCodecBitRateControlMode_Variable}, INT_MIN, INT_MAX,
AE,
"mode"},
594 #define FFAT_ENC_CLASS(NAME) \
595 static const AVClass ffat_##NAME##_enc_class = { \
596 .class_name = "at_" #NAME "_enc", \
597 .item_name = av_default_item_name, \
599 .version = LIBAVUTIL_VERSION_INT, \
602 #define FFAT_ENC(NAME, ID, PROFILES, ...) \
603 FFAT_ENC_CLASS(NAME) \
604 AVCodec ff_##NAME##_at_encoder = { \
605 .name = #NAME "_at", \
606 .long_name = NULL_IF_CONFIG_SMALL(#NAME " (AudioToolbox)"), \
607 .type = AVMEDIA_TYPE_AUDIO, \
609 .priv_data_size = sizeof(ATDecodeContext), \
610 .init = ffat_init_encoder, \
611 .close = ffat_close_encoder, \
612 .encode2 = ffat_encode, \
613 .flush = ffat_encode_flush, \
614 .priv_class = &ffat_##NAME##_enc_class, \
615 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY __VA_ARGS__, \
616 .sample_fmts = (const enum AVSampleFormat[]) { \
618 AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_NONE \
620 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \
621 .profiles = PROFILES, \
static AVFrame * ff_bufqueue_get(struct FFBufQueue *queue)
Get the first buffer from the queue and remove it.
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
Remove frame(s) from the queue.
#define AV_CH_LAYOUT_7POINT1
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
#define AV_CH_LAYOUT_6POINT1
#define AV_CH_LAYOUT_6POINT0
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
#define AV_CH_LAYOUT_SURROUND
struct FFBufQueue used_frame_queue
struct FFBufQueue frame_queue
#define AV_CH_LOW_FREQUENCY_2
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_7POINT0
#define AV_CH_SURROUND_DIRECT_RIGHT
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
#define AV_CH_LAYOUT_STEREO
#define FF_PROFILE_AAC_HE_V2
#define AV_CH_LAYOUT_5POINT0
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
Structure holding the queue.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
enum AVSampleFormat sample_fmt
audio sample format
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define AV_CH_LOW_FREQUENCY
#define FF_PROFILE_AAC_LD
#define AV_CH_LAYOUT_5POINT1
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define MP4DecSpecificDescrTag
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
int initial_padding
Audio only.
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
int flags
AV_CODEC_FLAG_*.
simple assert() macros that are a bit more flexible than ISO C assert().
#define AV_CH_LAYOUT_QUAD
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
#define FF_PROFILE_AAC_ELD
#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE
Audio encoder supports receiving a different number of samples in each call.
uint64_t channel_layout
Audio channel layout.
const uint8_t * buffer_end
#define AV_CH_STEREO_RIGHT
See AV_CH_STEREO_LEFT.
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
static int ff_bufqueue_is_full(struct FFBufQueue *queue)
Test if a buffer queue is full.
#define FF_PROFILE_AAC_LOW
#define FF_PROFILE_UNKNOWN
AudioConverterRef converter
static void ff_bufqueue_discard_all(struct FFBufQueue *queue)
Unref and remove all buffers from the queue.
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
int frame_size
Number of samples per channel in an audio frame.
Libavcodec external API header.
#define MP4DecConfigDescrTag
unsigned short available
number of available buffers
int sample_rate
samples per second
main external API structure.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AV_CH_TOP_BACK_RIGHT
static const uint16_t channel_layouts[7]
Describe the class of an AVClass context structure.
#define AV_CH_LAYOUT_7POINT1_WIDE_BACK
#define AV_CH_LAYOUT_OCTAGONAL
const VDPAUPixFmtMap * map
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
int global_quality
Global quality for codecs which cannot change it per frame.
#define AV_CH_BACK_CENTER
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
common internal api header.
#define AV_CODEC_CAP_LOSSLESS
Codec is lossless.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
#define MKBETAG(a, b, c, d)
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int channels
number of audio channels
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
#define FF_PROFILE_AAC_HE
int64_t av_get_default_channel_layout(int nb_channels)
Return default channel layout for a given number of channels.
static void ff_bufqueue_add(void *log, struct FFBufQueue *queue, AVFrame *buf)
Add a buffer to the queue.
#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...
int64_t rc_max_rate
maximum bitrate