X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fac3enc_float.c;h=a4abd89d4da3df06054c67806b3e01dcbf7dd4e8;hb=8d3348c2c4c3373bf6e1410659790d985c14b057;hp=f3246362e796c835ff09aa520a7814fe26d9a702;hpb=ac05f9030ed4baae317071d0321c91afabaf1080;p=ffmpeg diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c index f3246362e79..a4abd89d4da 100644 --- a/libavcodec/ac3enc_float.c +++ b/libavcodec/ac3enc_float.c @@ -4,20 +4,20 @@ * Copyright (c) 2006-2010 Justin Ruggles * Copyright (c) 2006-2010 Prakash Punnoor * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -27,102 +27,127 @@ */ #define CONFIG_AC3ENC_FLOAT 1 -#include "ac3enc.c" +#include "ac3enc.h" +#include "eac3enc.h" +#include "kbdwin.h" + + +#if CONFIG_AC3_ENCODER +#define AC3ENC_TYPE AC3ENC_TYPE_AC3 +#include "ac3enc_opts_template.c" +static const AVClass ac3enc_class = { "AC-3 Encoder", av_default_item_name, + ac3_options, LIBAVUTIL_VERSION_INT }; +#endif + +#include "ac3enc_template.c" /** * Finalize MDCT and free allocated memory. + * + * @param s AC-3 encoder private context */ -static av_cold void mdct_end(AC3MDCTContext *mdct) +av_cold void ff_ac3_float_mdct_end(AC3EncodeContext *s) { - ff_mdct_end(&mdct->fft); - av_freep(&mdct->window); + ff_mdct_end(&s->mdct); + av_freep(&s->mdct_window); } /** * Initialize MDCT tables. - * @param nbits log2(MDCT size) + * + * @param s AC-3 encoder private context + * @return 0 on success, negative error code on failure */ -static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, - int nbits) +av_cold int ff_ac3_float_mdct_init(AC3EncodeContext *s) { float *window; - int n, n2; + int i, n, n2; - n = 1 << nbits; + n = 1 << 9; n2 = n >> 1; - window = av_malloc(n2 * sizeof(*window)); + window = av_malloc(n * sizeof(*window)); if (!window) { - av_log(avctx, AV_LOG_ERROR, "Cannot allocate memory.\n"); + av_log(s->avctx, AV_LOG_ERROR, "Cannot allocate memory.\n"); return AVERROR(ENOMEM); } ff_kbd_window_init(window, 5.0, n2); - mdct->window = window; + for (i = 0; i < n2; i++) + window[n-1-i] = window[i]; + s->mdct_window = window; - return ff_mdct_init(&mdct->fft, nbits, 0, -2.0 / n); + return ff_mdct_init(&s->mdct, 9, 0, -2.0 / n); } -/** - * Calculate a 512-point MDCT - * @param out 256 output frequency coefficients - * @param in 512 windowed input audio samples +/* + * Apply KBD window to input samples prior to MDCT. */ -static void mdct512(AC3MDCTContext *mdct, float *out, float *in) +static void apply_window(DSPContext *dsp, float *output, const float *input, + const float *window, unsigned int len) { - ff_mdct_calc(&mdct->fft, out, in); + dsp->vector_fmul(output, input, window, len); } -/** - * Apply KBD window to input samples prior to MDCT. +/* + * Normalize the input samples. + * Not needed for the floating-point encoder. */ -static void apply_window(float *output, const float *input, - const float *window, int n) +static int normalize_samples(AC3EncodeContext *s) { - int i; - int n2 = n >> 1; + return 0; +} - for (i = 0; i < n2; i++) { - output[i] = input[i] * window[i]; - output[n-i-1] = input[n-i-1] * window[i]; - } + +/* + * Scale MDCT coefficients from float to 24-bit fixed-point. + */ +static void scale_coefficients(AC3EncodeContext *s) +{ + int chan_size = AC3_MAX_COEFS * s->num_blocks; + int cpl = s->cpl_on; + s->ac3dsp.float_to_fixed24(s->fixed_coef_buffer + (chan_size * !cpl), + s->mdct_coef_buffer + (chan_size * !cpl), + chan_size * (s->channels + cpl)); } -/** - * Normalize the input samples to use the maximum available precision. +/* + * Clip MDCT coefficients to allowable range. */ -static int normalize_samples(AC3EncodeContext *s) +static void clip_coefficients(DSPContext *dsp, float *coef, unsigned int len) { - /* Normalization is not needed for floating-point samples, so just return 0 */ - return 0; + dsp->vector_clipf(coef, coef, COEF_MIN, COEF_MAX, len); } -/** - * Scale MDCT coefficients from float to 24-bit fixed-point. +/* + * Calculate a single coupling coordinate. */ -static void scale_coefficients(AC3EncodeContext *s) +static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl) { - int i; - for (i = 0; i < AC3_MAX_COEFS * AC3_MAX_BLOCKS * s->channels; i++) - s->fixed_coef_buffer[i] = SCALE_FLOAT(s->mdct_coef_buffer[i], 24); + float coord = 0.125; + if (energy_cpl > 0) + coord *= sqrtf(energy_ch / energy_cpl); + return FFMIN(coord, COEF_MAX); } -AVCodec ac3_encoder = { - "ac3", - AVMEDIA_TYPE_AUDIO, - CODEC_ID_AC3, - sizeof(AC3EncodeContext), - ac3_encode_init, - ac3_encode_frame, - ac3_encode_close, - NULL, +#if CONFIG_AC3_ENCODER +AVCodec ff_ac3_encoder = { + .name = "ac3", + .type = AVMEDIA_TYPE_AUDIO, + .id = CODEC_ID_AC3, + .priv_data_size = sizeof(AC3EncodeContext), + .init = ff_ac3_encode_init, + .encode = ff_ac3_float_encode_frame, + .close = ff_ac3_encode_close, .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), - .channel_layouts = ac3_channel_layouts, + .priv_class = &ac3enc_class, + .channel_layouts = ff_ac3_channel_layouts, }; +#endif