/*
 * AAC encoder quantization
 * Copyright (C) 2015 Claudio Freire
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg 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,
 * 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
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * AAC encoder quantization misc reusable function templates
 * @author Claudio Freire ( klaussfreire gmail com )
 */

#ifndef AVCODEC_AACENC_QUANTIZATION_MISC_H
#define AVCODEC_AACENC_QUANTIZATION_MISC_H

static inline float quantize_band_cost_cached(struct AACEncContext *s, int w, int g, const float *in,
                                const float *scaled, int size, int scale_idx,
                                int cb, const float lambda, const float uplim,
                                int *bits, float *energy, int rtz)
{
    AACQuantizeBandCostCacheEntry *entry;
    av_assert1(scale_idx >= 0 && scale_idx < 256);
    entry = &s->quantize_band_cost_cache[scale_idx][w*16+g];
    if (entry->bits < 0 || entry->cb != cb || entry->rtz != rtz) {
        entry->rd = quantize_band_cost(s, in, scaled, size, scale_idx,
                                       cb, lambda, uplim, &entry->bits, &entry->energy, rtz);
        entry->cb = cb;
        entry->rtz = rtz;
    }
    if (bits)
        *bits = entry->bits;
    if (energy)
        *energy = entry->energy;
    return entry->rd;
}

#endif /* AVCODEC_AACENC_QUANTIZATION_MISC_H */
