1 /*
2 * Interface to libfaac for aac encoding
3 * Copyright (c) 2002 Gildas Bazin <gbazin@netcourrier.com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Interface to libfaac for aac encoding.
25 */
26
27 #include <faac.h>
28
34
35
36 /* libfaac has an encoder delay of 1024 samples */
37 #define FAAC_DELAY_SAMPLES 1024
38
43
45 {
47
50
53
54 return 0;
55 }
56
58 { 2, 0, 1 }, //< C L R
59 { 2, 0, 1, 3 }, //< C L R Cs
60 { 2, 0, 1, 3, 4 }, //< C L R Ls Rs
61 { 2, 0, 1, 4, 5, 3 }, //< C L R Ls Rs LFE
62 };
63
65 {
67 faacEncConfigurationPtr faac_cfg;
68 unsigned long samples_input, max_bytes_output;
69 int ret;
70
71 /* number of channels */
75 goto error;
76 }
77
80 &samples_input, &max_bytes_output);
84 goto error;
85 }
86
87 /* check faac version */
88 faac_cfg = faacEncGetCurrentConfiguration(s->
faac_handle);
89 if (faac_cfg->version != FAAC_CFG_VERSION) {
90 av_log(avctx,
AV_LOG_ERROR,
"wrong libfaac version (compiled for: %d, using %d)\n", FAAC_CFG_VERSION, faac_cfg->version);
92 goto error;
93 }
94
95 /* put the options in the configuration struct */
98 faac_cfg->aacObjectType =
MAIN;
99 break;
102 faac_cfg->aacObjectType = LOW;
103 break;
105 faac_cfg->aacObjectType = SSR;
106 break;
108 faac_cfg->aacObjectType = LTP;
109 break;
110 default:
113 goto error;
114 }
115 faac_cfg->mpegVersion = MPEG4;
116 faac_cfg->useTns = 0;
117 faac_cfg->allowMidside = 1;
119 faac_cfg->bandWidth = avctx->
cutoff;
121 faac_cfg->bitRate = 0;
123 }
124 faac_cfg->outputFormat = 1;
125 faac_cfg->inputFormat = FAAC_INPUT_16BIT;
129
131
132 /* Set decoder specific info */
135
137 unsigned long decoder_specific_info_size;
138
139 if (!faacEncGetDecoderSpecificInfo(s->
faac_handle, &buffer,
140 &decoder_specific_info_size)) {
144 goto error;
145 }
148 faac_cfg->outputFormat = 0;
149 }
150 free(buffer);
151 }
152
153 if (!faacEncSetConfiguration(s->
faac_handle, faac_cfg)) {
154 int i;
155 for (i = avctx->
bit_rate/1000; i ; i--) {
156 faac_cfg->bitRate = 1000*i / avctx->
channels;
157 if (faacEncSetConfiguration(s->
faac_handle, faac_cfg))
158 break;
159 }
160 if (!i) {
163 goto error;
164 } else {
166 av_log(avctx,
AV_LOG_WARNING,
"libfaac doesn't support the specified bitrate, using %dkbit/s instead\n", i);
167 }
168 }
169
172
173 return 0;
174 error:
176 return ret;
177 }
178
181 {
183 int bytes_written, ret;
184 int num_samples = frame ? frame->
nb_samples : 0;
185 void *samples = frame ? frame->
data[0] :
NULL;
186
188 return ret;
189
190 bytes_written = faacEncEncode(s->
faac_handle, samples,
193 if (bytes_written < 0) {
195 return bytes_written;
196 }
197
198 /* add current frame to the queue */
199 if (frame) {
201 return ret;
202 }
203
204 if (!bytes_written)
205 return 0;
206
207 /* Get the next frame pts/duration */
210
211 avpkt->
size = bytes_written;
212 *got_packet_ptr = 1;
213 return 0;
214 }
215
222 };
223
231 0
232 };
233
248 };
faacEncHandle faac_handle
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
Remove frame(s) from the queue.
This structure describes decoded (raw) audio or video data.
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
#define AV_CH_LAYOUT_SURROUND
static av_cold int Faac_encode_init(AVCodecContext *avctx)
static av_cold int init(AVCodecContext *avctx)
#define FF_PROFILE_AAC_MAIN
#define AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_STEREO
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
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.
static av_cold int Faac_encode_close(AVCodecContext *avctx)
AVCodec ff_libfaac_encoder
#define FF_PROFILE_AAC_LTP
static int Faac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define FAAC_DELAY_SAMPLES
int initial_padding
Audio only.
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
audio channel layout utility functions
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define FF_PROFILE_AAC_LOW
#define FF_PROFILE_UNKNOWN
static const uint64_t faac_channel_layouts[]
#define AV_CH_LAYOUT_5POINT1_BACK
int frame_size
Number of samples per channel in an audio frame.
Libavcodec external API header.
AVSampleFormat
Audio sample formats.
int sample_rate
samples per second
main external API structure.
#define FF_PROFILE_AAC_SSR
#define AV_CH_LAYOUT_5POINT0_BACK
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.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
static const AVProfile profiles[]
common internal api header.
common internal and external API header
static const int channel_maps[][6]
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int cutoff
Audio cutoff bandwidth (0 means "automatic")
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.
static enum AVSampleFormat sample_fmts[]
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...