1/* 2 * AAC encoder quantizer 3 * Copyright (C) 2015 Rostislav Pehlivanov 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22/** 23 * @file 24 * AAC encoder quantizer 25 * @author Rostislav Pehlivanov ( atomnuker gmail com ) 26 */ 27 28#ifndef AVCODEC_AACENC_QUANTIZATION_H 29#define AVCODEC_AACENC_QUANTIZATION_H 30 31#include "aactab.h" 32#include "aacenc.h" 33#include "aacenctab.h" 34#include "aacenc_utils.h" 35 36/** 37 * Calculate rate distortion cost for quantizing with given codebook 38 * 39 * @return quantization distortion 40 */ 41static av_always_inline float quantize_and_encode_band_cost_template( 42 struct AACEncContext *s, 43 PutBitContext *pb, const float *in, float *out, 44 const float *scaled, int size, int scale_idx, 45 int cb, const float lambda, const float uplim, 46 int *bits, float *energy, int BT_ZERO, int BT_UNSIGNED, 47 int BT_PAIR, int BT_ESC, int BT_NOISE, int BT_STEREO, 48 const float ROUNDING) 49{ 50 const int q_idx = POW_SF2_ZERO - scale_idx + SCALE_ONE_POS - SCALE_DIV_512; 51 const float Q = ff_aac_pow2sf_tab [q_idx]; 52 const float Q34 = ff_aac_pow34sf_tab[q_idx]; 53 const float IQ = ff_aac_pow2sf_tab [POW_SF2_ZERO + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; 54 const float CLIPPED_ESCAPE = 165140.0f*IQ; 55 int i, j; 56 float cost = 0; 57 float qenergy = 0; 58 const int dim = BT_PAIR ? 2 : 4; 59 int resbits = 0; 60 int off; 61 62 if (BT_ZERO || BT_NOISE || BT_STEREO) { 63 for (i = 0; i < size; i++) 64 cost += in[i]*in[i]; 65 if (bits) 66 *bits = 0; 67 if (energy) 68 *energy = qenergy; 69 if (out) { 70 for (i = 0; i < size; i += dim) 71 for (j = 0; j < dim; j++) 72 out[i+j] = 0.0f; 73 } 74 return cost * lambda; 75 } 76 if (!scaled) { 77 s->abs_pow34(s->scoefs, in, size); 78 scaled = s->scoefs; 79 } 80 s->quant_bands(s->qcoefs, in, scaled, size, !BT_UNSIGNED, aac_cb_maxval[cb], Q34, ROUNDING); 81 if (BT_UNSIGNED) { 82 off = 0; 83 } else { 84 off = aac_cb_maxval[cb]; 85 } 86 for (i = 0; i < size; i += dim) { 87 const float *vec; 88 int *quants = s->qcoefs + i; 89 int curidx = 0; 90 int curbits; 91 float quantized, rd = 0.0f; 92 for (j = 0; j < dim; j++) { 93 curidx *= aac_cb_range[cb]; 94 curidx += quants[j] + off; 95 } 96 curbits = ff_aac_spectral_bits[cb-1][curidx]; 97 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; 98 if (BT_UNSIGNED) { 99 for (j = 0; j < dim; j++) { 100 float t = fabsf(in[i+j]); 101 float di; 102 if (BT_ESC && vec[j] == 64.0f) { //FIXME: slow 103 if (t >= CLIPPED_ESCAPE) { 104 quantized = CLIPPED_ESCAPE; 105 curbits += 21; 106 } else { 107 int c = av_clip_uintp2(quant(t, Q, ROUNDING), 13); 108 quantized = c*cbrtf(c)*IQ; 109 curbits += av_log2(c)*2 - 4 + 1; 110 } 111 } else { 112 quantized = vec[j]*IQ; 113 } 114 di = t - quantized; 115 if (out) 116 out[i+j] = in[i+j] >= 0 ? quantized : -quantized; 117 if (vec[j] != 0.0f) 118 curbits++; 119 qenergy += quantized*quantized; 120 rd += di*di; 121 } 122 } else { 123 for (j = 0; j < dim; j++) { 124 quantized = vec[j]*IQ; 125 qenergy += quantized*quantized; 126 if (out) 127 out[i+j] = quantized; 128 rd += (in[i+j] - quantized)*(in[i+j] - quantized); 129 } 130 } 131 cost += rd * lambda + curbits; 132 resbits += curbits; 133 if (cost >= uplim) 134 return uplim; 135 if (pb) { 136 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]); 137 if (BT_UNSIGNED) 138 for (j = 0; j < dim; j++) 139 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f) 140 put_bits(pb, 1, in[i+j] < 0.0f); 141 if (BT_ESC) { 142 for (j = 0; j < 2; j++) { 143 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) { 144 int coef = av_clip_uintp2(quant(fabsf(in[i+j]), Q, ROUNDING), 13); 145 int len = av_log2(coef); 146 147 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); 148 put_sbits(pb, len, coef); 149 } 150 } 151 } 152 } 153 } 154 155 if (bits) 156 *bits = resbits; 157 if (energy) 158 *energy = qenergy; 159 return cost; 160} 161 162static inline float quantize_and_encode_band_cost_NONE(struct AACEncContext *s, PutBitContext *pb, 163 const float *in, float *quant, const float *scaled, 164 int size, int scale_idx, int cb, 165 const float lambda, const float uplim, 166 int *bits, float *energy) { 167 av_assert0(0); 168 return 0.0f; 169} 170 171#define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE, BT_STEREO, ROUNDING) \ 172static float quantize_and_encode_band_cost_ ## NAME( \ 173 struct AACEncContext *s, \ 174 PutBitContext *pb, const float *in, float *quant, \ 175 const float *scaled, int size, int scale_idx, \ 176 int cb, const float lambda, const float uplim, \ 177 int *bits, float *energy) { \ 178 return quantize_and_encode_band_cost_template( \ 179 s, pb, in, quant, scaled, size, scale_idx, \ 180 BT_ESC ? ESC_BT : cb, lambda, uplim, bits, energy, \ 181 BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE, BT_STEREO, \ 182 ROUNDING); \ 183} 184 185QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ZERO, 1, 0, 0, 0, 0, 0, ROUND_STANDARD) 186QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD, 0, 0, 0, 0, 0, 0, ROUND_STANDARD) 187QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD, 0, 1, 0, 0, 0, 0, ROUND_STANDARD) 188QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR, 0, 0, 1, 0, 0, 0, ROUND_STANDARD) 189QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR, 0, 1, 1, 0, 0, 0, ROUND_STANDARD) 190QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC, 0, 1, 1, 1, 0, 0, ROUND_STANDARD) 191QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC_RTZ, 0, 1, 1, 1, 0, 0, ROUND_TO_ZERO) 192QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NOISE, 0, 0, 0, 0, 1, 0, ROUND_STANDARD) 193QUANTIZE_AND_ENCODE_BAND_COST_FUNC(STEREO,0, 0, 0, 0, 0, 1, ROUND_STANDARD) 194 195static float (*const quantize_and_encode_band_cost_arr[])( 196 struct AACEncContext *s, 197 PutBitContext *pb, const float *in, float *quant, 198 const float *scaled, int size, int scale_idx, 199 int cb, const float lambda, const float uplim, 200 int *bits, float *energy) = { 201 quantize_and_encode_band_cost_ZERO, 202 quantize_and_encode_band_cost_SQUAD, 203 quantize_and_encode_band_cost_SQUAD, 204 quantize_and_encode_band_cost_UQUAD, 205 quantize_and_encode_band_cost_UQUAD, 206 quantize_and_encode_band_cost_SPAIR, 207 quantize_and_encode_band_cost_SPAIR, 208 quantize_and_encode_band_cost_UPAIR, 209 quantize_and_encode_band_cost_UPAIR, 210 quantize_and_encode_band_cost_UPAIR, 211 quantize_and_encode_band_cost_UPAIR, 212 quantize_and_encode_band_cost_ESC, 213 quantize_and_encode_band_cost_NONE, /* CB 12 doesn't exist */ 214 quantize_and_encode_band_cost_NOISE, 215 quantize_and_encode_band_cost_STEREO, 216 quantize_and_encode_band_cost_STEREO, 217}; 218 219static float (*const quantize_and_encode_band_cost_rtz_arr[])( 220 struct AACEncContext *s, 221 PutBitContext *pb, const float *in, float *quant, 222 const float *scaled, int size, int scale_idx, 223 int cb, const float lambda, const float uplim, 224 int *bits, float *energy) = { 225 quantize_and_encode_band_cost_ZERO, 226 quantize_and_encode_band_cost_SQUAD, 227 quantize_and_encode_band_cost_SQUAD, 228 quantize_and_encode_band_cost_UQUAD, 229 quantize_and_encode_band_cost_UQUAD, 230 quantize_and_encode_band_cost_SPAIR, 231 quantize_and_encode_band_cost_SPAIR, 232 quantize_and_encode_band_cost_UPAIR, 233 quantize_and_encode_band_cost_UPAIR, 234 quantize_and_encode_band_cost_UPAIR, 235 quantize_and_encode_band_cost_UPAIR, 236 quantize_and_encode_band_cost_ESC_RTZ, 237 quantize_and_encode_band_cost_NONE, /* CB 12 doesn't exist */ 238 quantize_and_encode_band_cost_NOISE, 239 quantize_and_encode_band_cost_STEREO, 240 quantize_and_encode_band_cost_STEREO, 241}; 242 243#define quantize_and_encode_band_cost( \ 244 s, pb, in, quant, scaled, size, scale_idx, cb, \ 245 lambda, uplim, bits, energy, rtz) \ 246 ((rtz) ? quantize_and_encode_band_cost_rtz_arr : quantize_and_encode_band_cost_arr)[cb]( \ 247 s, pb, in, quant, scaled, size, scale_idx, cb, \ 248 lambda, uplim, bits, energy) 249 250static inline float quantize_band_cost(struct AACEncContext *s, const float *in, 251 const float *scaled, int size, int scale_idx, 252 int cb, const float lambda, const float uplim, 253 int *bits, float *energy, int rtz) 254{ 255 return quantize_and_encode_band_cost(s, NULL, in, NULL, scaled, size, scale_idx, 256 cb, lambda, uplim, bits, energy, rtz); 257} 258 259static inline int quantize_band_cost_bits(struct AACEncContext *s, const float *in, 260 const float *scaled, int size, int scale_idx, 261 int cb, const float lambda, const float uplim, 262 int *bits, float *energy, int rtz) 263{ 264 int auxbits; 265 quantize_and_encode_band_cost(s, NULL, in, NULL, scaled, size, scale_idx, 266 cb, 0.0f, uplim, &auxbits, energy, rtz); 267 if (bits) { 268 *bits = auxbits; 269 } 270 return auxbits; 271} 272 273static inline void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, 274 const float *in, float *out, int size, int scale_idx, 275 int cb, const float lambda, int rtz) 276{ 277 quantize_and_encode_band_cost(s, pb, in, out, NULL, size, scale_idx, cb, lambda, 278 INFINITY, NULL, NULL, rtz); 279} 280 281#include "aacenc_quantization_misc.h" 282 283#endif /* AVCODEC_AACENC_QUANTIZATION_H */ 284