Skip to content
Snippets Groups Projects
  • Justin Ruggles's avatar
    7f3a7b5c
    ac3enc: add channel coupling support · 7f3a7b5c
    Justin Ruggles authored
    Channel coupling is an optional AC-3 feature that increases quality by
    combining high frequency information from multiple channels into a
    single channel. The per-channel high frequency information is sent with
    less accuracy in both the frequency and time domains. This allows more
    bits to be used for lower frequencies while preserving enough
    information to reconstruct the high frequencies.
    7f3a7b5c
    History
    ac3enc: add channel coupling support
    Justin Ruggles authored
    Channel coupling is an optional AC-3 feature that increases quality by
    combining high frequency information from multiple channels into a
    single channel. The per-channel high frequency information is sent with
    less accuracy in both the frequency and time domains. This allows more
    bits to be used for lower frequencies while preserving enough
    information to reconstruct the high frequencies.
ac3enc_float.c 3.07 KiB
/*
 * The simplest AC-3 encoder
 * Copyright (c) 2000 Fabrice Bellard
 * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com>
 * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de>
 *
 * This file is part of Libav.
 *
 * 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.
 *
 * 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 Libav; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * floating-point AC-3 encoder.
 */

#define CONFIG_AC3ENC_FLOAT 1
#include "ac3enc.c"
#include "kbdwin.h"


/**
 * Finalize MDCT and free allocated memory.
 */
static av_cold void mdct_end(AC3MDCTContext *mdct)
{
    ff_mdct_end(&mdct->fft);
    av_freep(&mdct->window);
}


/**
 * Initialize MDCT tables.
 * @param nbits log2(MDCT size)
 */
static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
                             int nbits)
{
    float *window;
    int i, n, n2;

    n  = 1 << nbits;
    n2 = n >> 1;

    window = av_malloc(n * sizeof(*window));
    if (!window) {
        av_log(avctx, AV_LOG_ERROR, "Cannot allocate memory.\n");
        return AVERROR(ENOMEM);
    }
    ff_kbd_window_init(window, 5.0, n2);
    for (i = 0; i < n2; i++)
        window[n-1-i] = window[i];
    mdct->window = window;

    return ff_mdct_init(&mdct->fft, nbits, 0, -2.0 / n);
}