X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Faacenc.c;h=ce102b6e3b12cf9c7fb84548f22928e378deef90;hb=8d872e8ac9d17dd004af60787cd69eac69ef8891;hp=3484521e9033ab8b31e95c9767db9dda9be3a03c;hpb=fd257dc4c0ee751ecf15830b91d28c15276fe93b;p=ffmpeg diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index 3484521e903..ce102b6e3b1 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -181,14 +181,14 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) ff_sine_window_init(ff_sine_1024, 1024); ff_sine_window_init(ff_sine_128, 128); - s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); - s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); - avctx->extradata = av_malloc(2); + s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); + s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); + avctx->extradata = av_malloc(2); avctx->extradata_size = 2; put_audio_specific_config(avctx); - sizes[0] = swb_size_1024[i]; - sizes[1] = swb_size_128[i]; + sizes[0] = swb_size_1024[i]; + sizes[1] = swb_size_128[i]; lengths[0] = ff_aac_num_swb_1024[i]; lengths[1] = ff_aac_num_swb_128[i]; ff_psy_init(&s->psy, avctx, 2, sizes, lengths); @@ -276,9 +276,8 @@ static void put_ics_info(AACEncContext *s, IndividualChannelStream *info) put_bits(&s->pb, 1, 0); // no prediction } else { put_bits(&s->pb, 4, info->max_sfb); - for (w = 1; w < 8; w++) { + for (w = 1; w < 8; w++) put_bits(&s->pb, 1, !info->group_len[w]); - } } } @@ -291,12 +290,10 @@ static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe) int i, w; put_bits(pb, 2, cpe->ms_mode); - if (cpe->ms_mode == 1) { - for (w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w]) { + if (cpe->ms_mode == 1) + for (w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w]) for (i = 0; i < cpe->ch[0].ics.max_sfb; i++) put_bits(pb, 1, cpe->ms_mask[w*16 + i]); - } - } } /** @@ -324,7 +321,8 @@ static void adjust_frame_information(AACEncContext *apc, ChannelElement *cpe, in } start += ics->swb_sizes[g]; } - for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--); + for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--) + ; maxsfb = FFMAX(maxsfb, cmaxsfb); } ics->max_sfb = maxsfb; @@ -352,9 +350,12 @@ static void adjust_frame_information(AACEncContext *apc, ChannelElement *cpe, in ics1->max_sfb = ics0->max_sfb; for (w = 0; w < ics0->num_windows*16; w += 16) for (i = 0; i < ics0->max_sfb; i++) - if (cpe->ms_mask[w+i]) msc++; - if (msc == 0 || ics0->max_sfb == 0) cpe->ms_mode = 0; - else cpe->ms_mode = msc < ics0->max_sfb ? 1 : 2; + if (cpe->ms_mask[w+i]) + msc++; + if (msc == 0 || ics0->max_sfb == 0) + cpe->ms_mode = 0; + else + cpe->ms_mode = msc < ics0->max_sfb ? 1 : 2; } } @@ -365,15 +366,15 @@ static void encode_band_info(AACEncContext *s, SingleChannelElement *sce) { int w; - for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { + for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) s->coder->encode_window_bands_info(s, sce, w, sce->ics.group_len[w], s->lambda); - } } /** * Encode scalefactors. */ -static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce) +static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, + SingleChannelElement *sce) { int off = sce->sf_idx[0], diff; int i, w; @@ -382,7 +383,8 @@ static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, Single for (i = 0; i < sce->ics.max_sfb; i++) { if (!sce->zeroes[w*16 + i]) { diff = sce->sf_idx[w*16 + i] - off + SCALE_DIFF_ZERO; - if (diff < 0 || diff > 120) av_log(avctx, AV_LOG_ERROR, "Scalefactor difference is too big to be coded\n"); + if (diff < 0 || diff > 120) + av_log(avctx, AV_LOG_ERROR, "Scalefactor difference is too big to be coded\n"); off = sce->sf_idx[w*16 + i]; put_bits(&s->pb, ff_aac_scalefactor_bits[diff], ff_aac_scalefactor_code[diff]); } @@ -398,7 +400,8 @@ static void encode_pulses(AACEncContext *s, Pulse *pulse) int i; put_bits(&s->pb, 1, !!pulse->num_pulse); - if (!pulse->num_pulse) return; + if (!pulse->num_pulse) + return; put_bits(&s->pb, 2, pulse->num_pulse - 1); put_bits(&s->pb, 6, pulse->start); @@ -422,13 +425,12 @@ static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) start += sce->ics.swb_sizes[i]; continue; } - for (w2 = w; w2 < w + sce->ics.group_len[w]; w2++) { + for (w2 = w; w2 < w + sce->ics.group_len[w]; w2++) s->coder->quantize_and_encode_band(s, &s->pb, sce->coeffs + start + w2*128, - sce->ics.swb_sizes[i], - sce->sf_idx[w*16 + i], - sce->band_type[w*16 + i], - s->lambda); - } + sce->ics.swb_sizes[i], + sce->sf_idx[w*16 + i], + sce->band_type[w*16 + i], + s->lambda); start += sce->ics.swb_sizes[i]; } } @@ -437,10 +439,13 @@ static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) /** * Encode one channel of audio data. */ -static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, int common_window) +static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, + SingleChannelElement *sce, + int common_window) { put_bits(&s->pb, 8, sce->sf_idx[0]); - if (!common_window) put_ics_info(s, &sce->ics); + if (!common_window) + put_ics_info(s, &sce->ics); encode_band_info(s, sce); encode_scale_factors(avctx, s, sce); encode_pulses(s, &sce->pulse); @@ -453,7 +458,8 @@ static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, Si /** * Write some auxiliary information about the created AAC file. */ -static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, const char *name) +static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, + const char *name) { int i, namelen, padbits; @@ -479,42 +485,42 @@ static int aac_encode_frame(AVCodecContext *avctx, int i, j, chans, tag, start_ch; const uint8_t *chan_map = aac_chan_configs[avctx->channels-1]; int chan_el_counter[4]; + FFPsyWindowInfo windows[avctx->channels]; if (s->last_frame) return 0; if (data) { if (!s->psypp) { - memcpy(s->samples + 1024 * avctx->channels, data, 1024 * avctx->channels * sizeof(s->samples[0])); + memcpy(s->samples + 1024 * avctx->channels, data, + 1024 * avctx->channels * sizeof(s->samples[0])); } else { start_ch = 0; samples2 = s->samples + 1024 * avctx->channels; for (i = 0; i < chan_map[0]; i++) { tag = chan_map[i+1]; chans = tag == TYPE_CPE ? 2 : 1; - ff_psy_preprocess(s->psypp, (uint16_t*)data + start_ch, samples2 + start_ch, start_ch, chans); + ff_psy_preprocess(s->psypp, (uint16_t*)data + start_ch, + samples2 + start_ch, start_ch, chans); start_ch += chans; } } } if (!avctx->frame_number) { - memcpy(s->samples, s->samples + 1024 * avctx->channels, 1024 * avctx->channels * sizeof(s->samples[0])); + memcpy(s->samples, s->samples + 1024 * avctx->channels, + 1024 * avctx->channels * sizeof(s->samples[0])); return 0; } - init_put_bits(&s->pb, frame, buf_size*8); - if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) { - put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); - } start_ch = 0; - memset(chan_el_counter, 0, sizeof(chan_el_counter)); for (i = 0; i < chan_map[0]; i++) { - FFPsyWindowInfo wi[2]; - tag = chan_map[i+1]; - chans = tag == TYPE_CPE ? 2 : 1; - cpe = &s->cpe[i]; + FFPsyWindowInfo* wi = windows + start_ch; + tag = chan_map[i+1]; + chans = tag == TYPE_CPE ? 2 : 1; + cpe = &s->cpe[i]; samples2 = samples + start_ch; - la = samples2 + 1024 * avctx->channels + start_ch; - if (!data) la = NULL; + la = samples2 + 1024 * avctx->channels + start_ch; + if (!data) + la = NULL; for (j = 0; j < chans; j++) { IndividualChannelStream *ics = &cpe->ch[j].ics; int k; @@ -531,40 +537,64 @@ static int aac_encode_frame(AVCodecContext *avctx, s->cur_channel = start_ch + j; apply_window_and_mdct(avctx, s, &cpe->ch[j], samples2, j); - s->coder->search_for_quantizers(avctx, s, &cpe->ch[j], s->lambda); } - cpe->common_window = 0; - if (chans > 1 - && wi[0].window_type[0] == wi[1].window_type[0] - && wi[0].window_shape == wi[1].window_shape) { - - cpe->common_window = 1; - for (j = 0; j < wi[0].num_windows; j++) { - if (wi[0].grouping[j] != wi[1].grouping[j]) { - cpe->common_window = 0; - break; + start_ch += chans; + } + do { + int frame_bits; + init_put_bits(&s->pb, frame, buf_size*8); + if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) + put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); + start_ch = 0; + memset(chan_el_counter, 0, sizeof(chan_el_counter)); + for (i = 0; i < chan_map[0]; i++) { + FFPsyWindowInfo* wi = windows + start_ch; + tag = chan_map[i+1]; + chans = tag == TYPE_CPE ? 2 : 1; + cpe = &s->cpe[i]; + for (j = 0; j < chans; j++) { + s->coder->search_for_quantizers(avctx, s, &cpe->ch[j], s->lambda); + } + cpe->common_window = 0; + if (chans > 1 + && wi[0].window_type[0] == wi[1].window_type[0] + && wi[0].window_shape == wi[1].window_shape) { + + cpe->common_window = 1; + for (j = 0; j < wi[0].num_windows; j++) { + if (wi[0].grouping[j] != wi[1].grouping[j]) { + cpe->common_window = 0; + break; + } } } - } - if (cpe->common_window && s->coder->search_for_ms) - s->coder->search_for_ms(s, cpe, s->lambda); - adjust_frame_information(s, cpe, chans); - put_bits(&s->pb, 3, tag); - put_bits(&s->pb, 4, chan_el_counter[tag]++); - if (chans == 2) { - put_bits(&s->pb, 1, cpe->common_window); - if (cpe->common_window) { - put_ics_info(s, &cpe->ch[0].ics); - encode_ms_info(&s->pb, cpe); + if (cpe->common_window && s->coder->search_for_ms) + s->coder->search_for_ms(s, cpe, s->lambda); + adjust_frame_information(s, cpe, chans); + put_bits(&s->pb, 3, tag); + put_bits(&s->pb, 4, chan_el_counter[tag]++); + if (chans == 2) { + put_bits(&s->pb, 1, cpe->common_window); + if (cpe->common_window) { + put_ics_info(s, &cpe->ch[0].ics); + encode_ms_info(&s->pb, cpe); + } } + for (j = 0; j < chans; j++) { + s->cur_channel = start_ch + j; + ff_psy_set_band_info(&s->psy, s->cur_channel, cpe->ch[j].coeffs, &wi[j]); + encode_individual_channel(avctx, s, &cpe->ch[j], cpe->common_window); + } + start_ch += chans; } - for (j = 0; j < chans; j++) { - s->cur_channel = start_ch + j; - ff_psy_set_band_info(&s->psy, s->cur_channel, cpe->ch[j].coeffs, &wi[j]); - encode_individual_channel(avctx, s, &cpe->ch[j], cpe->common_window); - } - start_ch += chans; - } + + frame_bits = put_bits_count(&s->pb); + if (frame_bits <= 6144 * avctx->channels - 3) + break; + + s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits; + + } while (1); put_bits(&s->pb, 3, TYPE_END); flush_put_bits(&s->pb); @@ -574,15 +604,13 @@ static int aac_encode_frame(AVCodecContext *avctx, if (!(avctx->flags & CODEC_FLAG_QSCALE)) { float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits; s->lambda *= ratio; - } - - if (avctx->frame_bits > 6144*avctx->channels) { - av_log(avctx, AV_LOG_ERROR, "input buffer violation %d > %d.\n", avctx->frame_bits, 6144*avctx->channels); + s->lambda = FFMIN(s->lambda, 65536.f); } if (!data) s->last_frame = 1; - memcpy(s->samples, s->samples + 1024 * avctx->channels, 1024 * avctx->channels * sizeof(s->samples[0])); + memcpy(s->samples, s->samples + 1024 * avctx->channels, + 1024 * avctx->channels * sizeof(s->samples[0])); return put_bits_count(&s->pb)>>3; } @@ -608,6 +636,6 @@ AVCodec aac_encoder = { aac_encode_frame, aac_encode_end, .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, - .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, + .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), };