/*
 * 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->generation != s->quantize_band_cost_cache_generation || 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;
        entry->generation = s->quantize_band_cost_cache_generation;
    }
    if (bits)
        *bits = entry->bits;
    if (energy)
        *energy = entry->energy;
    return entry->rd;
}

#endif /* AVCODEC_AACENC_QUANTIZATION_MISC_H */
