Mercurial > libavcodec.hg
annotate aacenc.c @ 8624:b1663f732e67 libavcodec
Fix 10L in r16670 (broke deblocking code)
| author | darkshikari |
|---|---|
| date | Sun, 18 Jan 2009 07:20:12 +0000 |
| parents | dc1a7a6ec58d |
| children | e9d9d946f213 |
| rev | line source |
|---|---|
| 7571 | 1 /* |
| 2 * AAC encoder | |
| 3 * Copyright (C) 2008 Konstantin Shishkov | |
| 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 aacenc.c | |
| 24 * AAC encoder | |
| 25 */ | |
| 26 | |
| 27 /*********************************** | |
| 28 * TODOs: | |
| 29 * psy model selection with some option | |
| 7584 | 30 * add sane pulse detection |
| 7681 | 31 * add temporal noise shaping |
| 7571 | 32 ***********************************/ |
| 33 | |
| 34 #include "avcodec.h" | |
| 35 #include "bitstream.h" | |
| 36 #include "dsputil.h" | |
| 37 #include "mpeg4audio.h" | |
| 38 | |
| 39 #include "aacpsy.h" | |
| 40 #include "aac.h" | |
| 41 #include "aactab.h" | |
| 42 | |
| 43 static const uint8_t swb_size_1024_96[] = { | |
| 44 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, | |
| 45 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, | |
| 46 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 | |
| 47 }; | |
| 48 | |
| 49 static const uint8_t swb_size_1024_64[] = { | |
| 50 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, | |
| 51 12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36, | |
| 52 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40 | |
| 53 }; | |
| 54 | |
| 55 static const uint8_t swb_size_1024_48[] = { | |
| 56 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
| 57 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
| 58 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, | |
| 59 96 | |
| 60 }; | |
| 61 | |
| 62 static const uint8_t swb_size_1024_32[] = { | |
| 63 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
| 64 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
| 65 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 | |
| 66 }; | |
| 67 | |
| 68 static const uint8_t swb_size_1024_24[] = { | |
| 69 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
| 70 12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, | |
| 71 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64 | |
| 72 }; | |
| 73 | |
| 74 static const uint8_t swb_size_1024_16[] = { | |
| 75 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
| 76 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28, | |
| 77 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64 | |
| 78 }; | |
| 79 | |
| 80 static const uint8_t swb_size_1024_8[] = { | |
| 81 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, | |
| 82 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28, | |
| 83 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 | |
| 84 }; | |
| 85 | |
| 7978 | 86 static const uint8_t * const swb_size_1024[] = { |
| 7571 | 87 swb_size_1024_96, swb_size_1024_96, swb_size_1024_64, |
| 88 swb_size_1024_48, swb_size_1024_48, swb_size_1024_32, | |
| 89 swb_size_1024_24, swb_size_1024_24, swb_size_1024_16, | |
| 90 swb_size_1024_16, swb_size_1024_16, swb_size_1024_8 | |
| 91 }; | |
| 92 | |
| 93 static const uint8_t swb_size_128_96[] = { | |
| 94 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36 | |
| 95 }; | |
| 96 | |
| 97 static const uint8_t swb_size_128_48[] = { | |
| 98 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16 | |
| 99 }; | |
| 100 | |
| 101 static const uint8_t swb_size_128_24[] = { | |
| 102 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20 | |
| 103 }; | |
| 104 | |
| 105 static const uint8_t swb_size_128_16[] = { | |
| 106 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20 | |
| 107 }; | |
| 108 | |
| 109 static const uint8_t swb_size_128_8[] = { | |
| 110 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20 | |
| 111 }; | |
| 112 | |
| 7978 | 113 static const uint8_t * const swb_size_128[] = { |
| 7571 | 114 /* the last entry on the following row is swb_size_128_64 but is a |
| 115 duplicate of swb_size_128_96 */ | |
| 116 swb_size_128_96, swb_size_128_96, swb_size_128_96, | |
| 117 swb_size_128_48, swb_size_128_48, swb_size_128_48, | |
| 118 swb_size_128_24, swb_size_128_24, swb_size_128_16, | |
| 119 swb_size_128_16, swb_size_128_16, swb_size_128_8 | |
| 120 }; | |
| 121 | |
| 7596 | 122 /** bits needed to code codebook run value for long windows */ |
| 123 static const uint8_t run_value_bits_long[64] = { | |
| 124 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 125 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, | |
| 126 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
| 127 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15 | |
| 128 }; | |
| 129 | |
| 130 /** bits needed to code codebook run value for short windows */ | |
| 131 static const uint8_t run_value_bits_short[16] = { | |
| 132 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9 | |
| 133 }; | |
| 134 | |
| 7978 | 135 static const uint8_t* const run_value_bits[2] = { |
| 7596 | 136 run_value_bits_long, run_value_bits_short |
| 137 }; | |
| 138 | |
| 7571 | 139 /** default channel configurations */ |
| 140 static const uint8_t aac_chan_configs[6][5] = { | |
| 7585 | 141 {1, TYPE_SCE}, // 1 channel - single channel element |
| 142 {1, TYPE_CPE}, // 2 channels - channel pair | |
| 143 {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo | |
| 144 {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center | |
| 145 {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo | |
| 146 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE | |
| 7571 | 147 }; |
| 148 | |
| 149 /** | |
| 7596 | 150 * structure used in optimal codebook search |
| 151 */ | |
| 152 typedef struct BandCodingPath { | |
| 153 int prev_idx; ///< pointer to the previous path point | |
| 154 int codebook; ///< codebook for coding band run | |
| 155 int bits; ///< number of bit needed to code given number of bands | |
| 156 } BandCodingPath; | |
| 157 | |
| 158 /** | |
| 7584 | 159 * AAC encoder context |
| 160 */ | |
| 161 typedef struct { | |
| 162 PutBitContext pb; | |
| 163 MDCTContext mdct1024; ///< long (1024 samples) frame transform context | |
| 164 MDCTContext mdct128; ///< short (128 samples) frame transform context | |
| 165 DSPContext dsp; | |
| 7605 | 166 DECLARE_ALIGNED_16(FFTSample, output[2048]); ///< temporary buffer for MDCT input coefficients |
| 167 int16_t* samples; ///< saved preprocessed input | |
| 168 | |
| 169 int samplerate_index; ///< MPEG-4 samplerate index | |
| 170 | |
| 171 ChannelElement *cpe; ///< channel elements | |
| 7596 | 172 AACPsyContext psy; ///< psychoacoustic model context |
| 173 int last_frame; | |
| 7584 | 174 } AACEncContext; |
| 175 | |
| 176 /** | |
| 7571 | 177 * Make AAC audio config object. |
| 178 * @see 1.6.2.1 "Syntax - AudioSpecificConfig" | |
| 179 */ | |
| 180 static void put_audio_specific_config(AVCodecContext *avctx) | |
| 181 { | |
| 182 PutBitContext pb; | |
| 183 AACEncContext *s = avctx->priv_data; | |
| 184 | |
| 185 init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8); | |
| 186 put_bits(&pb, 5, 2); //object type - AAC-LC | |
| 187 put_bits(&pb, 4, s->samplerate_index); //sample rate index | |
| 188 put_bits(&pb, 4, avctx->channels); | |
| 189 //GASpecificConfig | |
| 190 put_bits(&pb, 1, 0); //frame length - 1024 samples | |
| 191 put_bits(&pb, 1, 0); //does not depend on core coder | |
| 192 put_bits(&pb, 1, 0); //is not extension | |
| 193 flush_put_bits(&pb); | |
| 194 } | |
| 195 | |
| 196 static av_cold int aac_encode_init(AVCodecContext *avctx) | |
| 197 { | |
| 198 AACEncContext *s = avctx->priv_data; | |
| 199 int i; | |
| 200 | |
| 201 avctx->frame_size = 1024; | |
| 202 | |
| 203 for(i = 0; i < 16; i++) | |
| 204 if(avctx->sample_rate == ff_mpeg4audio_sample_rates[i]) | |
| 205 break; | |
| 206 if(i == 16){ | |
| 207 av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate); | |
| 208 return -1; | |
| 209 } | |
| 210 if(avctx->channels > 6){ | |
| 211 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels); | |
| 212 return -1; | |
| 213 } | |
| 214 s->samplerate_index = i; | |
| 215 | |
| 216 dsputil_init(&s->dsp, avctx); | |
| 217 ff_mdct_init(&s->mdct1024, 11, 0); | |
| 218 ff_mdct_init(&s->mdct128, 8, 0); | |
| 7584 | 219 // window init |
| 220 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | |
| 221 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128); | |
| 222 ff_sine_window_init(ff_sine_1024, 1024); | |
| 223 ff_sine_window_init(ff_sine_128, 128); | |
| 7571 | 224 |
| 225 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); | |
| 226 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); | |
| 7605 | 227 if(ff_aac_psy_init(&s->psy, avctx, AAC_PSY_3GPP, |
| 228 aac_chan_configs[avctx->channels-1][0], 0, | |
| 7681 | 229 swb_size_1024[i], ff_aac_num_swb_1024[i], swb_size_128[i], ff_aac_num_swb_128[i]) < 0){ |
| 7571 | 230 av_log(avctx, AV_LOG_ERROR, "Cannot initialize selected model.\n"); |
| 231 return -1; | |
| 232 } | |
| 233 avctx->extradata = av_malloc(2); | |
| 234 avctx->extradata_size = 2; | |
| 235 put_audio_specific_config(avctx); | |
| 236 return 0; | |
| 237 } | |
| 238 | |
| 239 /** | |
| 240 * Encode ics_info element. | |
| 241 * @see Table 4.6 (syntax of ics_info) | |
| 242 */ | |
| 7681 | 243 static void put_ics_info(AACEncContext *s, IndividualChannelStream *info) |
| 7571 | 244 { |
| 245 int i; | |
| 246 | |
| 247 put_bits(&s->pb, 1, 0); // ics_reserved bit | |
| 248 put_bits(&s->pb, 2, info->window_sequence[0]); | |
| 249 put_bits(&s->pb, 1, info->use_kb_window[0]); | |
| 250 if(info->window_sequence[0] != EIGHT_SHORT_SEQUENCE){ | |
| 251 put_bits(&s->pb, 6, info->max_sfb); | |
| 252 put_bits(&s->pb, 1, 0); // no prediction | |
| 253 }else{ | |
| 254 put_bits(&s->pb, 4, info->max_sfb); | |
| 255 for(i = 1; i < info->num_windows; i++) | |
| 256 put_bits(&s->pb, 1, info->group_len[i]); | |
| 257 } | |
| 258 } | |
| 259 | |
| 260 /** | |
| 7681 | 261 * Calculate the number of bits needed to code all coefficient signs in current band. |
| 262 */ | |
| 263 static int calculate_band_sign_bits(AACEncContext *s, SingleChannelElement *sce, | |
| 264 int group_len, int start, int size) | |
| 265 { | |
| 266 int bits = 0; | |
| 267 int i, w; | |
| 268 for(w = 0; w < group_len; w++){ | |
| 269 for(i = 0; i < size; i++){ | |
| 270 if(sce->icoefs[start + i]) | |
| 271 bits++; | |
| 272 } | |
| 273 start += 128; | |
| 274 } | |
| 275 return bits; | |
| 276 } | |
| 277 | |
| 278 /** | |
| 7584 | 279 * Encode pulse data. |
| 280 */ | |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
281 static void encode_pulses(AACEncContext *s, Pulse *pulse) |
| 7584 | 282 { |
| 283 int i; | |
| 284 | |
| 285 put_bits(&s->pb, 1, !!pulse->num_pulse); | |
| 286 if(!pulse->num_pulse) return; | |
| 287 | |
| 288 put_bits(&s->pb, 2, pulse->num_pulse - 1); | |
| 289 put_bits(&s->pb, 6, pulse->start); | |
| 290 for(i = 0; i < pulse->num_pulse; i++){ | |
| 7585 | 291 put_bits(&s->pb, 5, pulse->pos[i]); |
| 7584 | 292 put_bits(&s->pb, 4, pulse->amp[i]); |
| 293 } | |
| 294 } | |
| 295 | |
| 296 /** | |
| 297 * Encode spectral coefficients processed by psychoacoustic model. | |
| 298 */ | |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
299 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) |
| 7584 | 300 { |
| 301 int start, i, w, w2, wg; | |
| 302 | |
| 303 w = 0; | |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
304 for(wg = 0; wg < sce->ics.num_window_groups; wg++){ |
| 7584 | 305 start = 0; |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
306 for(i = 0; i < sce->ics.max_sfb; i++){ |
|
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
307 if(sce->zeroes[w*16 + i]){ |
|
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
308 start += sce->ics.swb_sizes[i]; |
| 7584 | 309 continue; |
| 310 } | |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
311 for(w2 = w; w2 < w + sce->ics.group_len[wg]; w2++){ |
| 7681 | 312 encode_band_coeffs(s, sce, start + w2*128, |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
313 sce->ics.swb_sizes[i], |
|
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
314 sce->band_type[w*16 + i]); |
| 7584 | 315 } |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
316 start += sce->ics.swb_sizes[i]; |
| 7584 | 317 } |
|
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
318 w += sce->ics.group_len[wg]; |
| 7584 | 319 } |
| 320 } | |
| 321 | |
| 322 /** | |
| 7571 | 323 * Write some auxiliary information about the created AAC file. |
| 324 */ | |
| 325 static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, const char *name) | |
| 326 { | |
| 327 int i, namelen, padbits; | |
| 328 | |
| 329 namelen = strlen(name) + 2; | |
| 7585 | 330 put_bits(&s->pb, 3, TYPE_FIL); |
| 7571 | 331 put_bits(&s->pb, 4, FFMIN(namelen, 15)); |
| 332 if(namelen >= 15) | |
| 333 put_bits(&s->pb, 8, namelen - 16); | |
| 334 put_bits(&s->pb, 4, 0); //extension type - filler | |
| 335 padbits = 8 - (put_bits_count(&s->pb) & 7); | |
| 336 align_put_bits(&s->pb); | |
| 337 for(i = 0; i < namelen - 2; i++) | |
| 338 put_bits(&s->pb, 8, name[i]); | |
| 339 put_bits(&s->pb, 12 - padbits, 0); | |
| 340 } | |
| 341 | |
| 342 static av_cold int aac_encode_end(AVCodecContext *avctx) | |
| 343 { | |
| 344 AACEncContext *s = avctx->priv_data; | |
| 345 | |
| 346 ff_mdct_end(&s->mdct1024); | |
| 347 ff_mdct_end(&s->mdct128); | |
| 348 ff_aac_psy_end(&s->psy); | |
| 349 av_freep(&s->samples); | |
| 350 av_freep(&s->cpe); | |
| 351 return 0; | |
| 352 } | |
| 353 | |
| 354 AVCodec aac_encoder = { | |
| 355 "aac", | |
| 356 CODEC_TYPE_AUDIO, | |
| 357 CODEC_ID_AAC, | |
| 358 sizeof(AACEncContext), | |
| 359 aac_encode_init, | |
| 360 aac_encode_frame, | |
| 361 aac_encode_end, | |
| 362 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | |
| 363 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, | |
| 364 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), | |
| 365 }; |
