annotate aaccoder.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents b120f1854e35
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1 /*
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
2 * AAC coefficients encoder
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
3 * Copyright (C) 2008-2009 Konstantin Shishkov
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
4 *
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
5 * This file is part of FFmpeg.
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
6 *
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
11 *
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
15 * Lesser General Public License for more details.
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
16 *
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
20 */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
21
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11537
diff changeset
23 * @file
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
24 * AAC coefficients encoder
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
25 */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
26
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
27 /***********************************
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
28 * TODOs:
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
29 * speedup quantizer selection
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
30 * add sane pulse detection
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
31 ***********************************/
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
32
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
33 #include <float.h>
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
34 #include "avcodec.h"
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
35 #include "put_bits.h"
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
36 #include "aac.h"
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
37 #include "aacenc.h"
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
38 #include "aactab.h"
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
39
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
40 /** bits needed to code codebook run value for long windows */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
41 static const uint8_t run_value_bits_long[64] = {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
42 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
43 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
44 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
45 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
46 };
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
47
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
48 /** bits needed to code codebook run value for short windows */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
49 static const uint8_t run_value_bits_short[16] = {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
50 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
51 };
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
52
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
53 static const uint8_t *run_value_bits[2] = {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
54 run_value_bits_long, run_value_bits_short
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
55 };
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
56
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
57
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
58 /**
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
59 * Quantize one coefficient.
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
60 * @return absolute value of the quantized coefficient
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
61 * @see 3GPP TS26.403 5.6.2 "Scalefactor determination"
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
62 */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
63 static av_always_inline int quant(float coef, const float Q)
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
64 {
9961
c0d721961a7f Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents: 9960
diff changeset
65 float a = coef * Q;
c0d721961a7f Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents: 9960
diff changeset
66 return sqrtf(a * sqrtf(a)) + 0.4054;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
67 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
68
11731
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
69 static void quantize_bands(int *out, const float *in, const float *scaled,
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
70 int size, float Q34, int is_signed, int maxval)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
71 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
72 int i;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
73 double qc;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
74 for (i = 0; i < size; i++) {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
75 qc = scaled[i] * Q34;
11731
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
76 out[i] = (int)FFMIN(qc + 0.4054, (double)maxval);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
77 if (is_signed && in[i] < 0.0f) {
11731
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
78 out[i] = -out[i];
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
79 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
80 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
81 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
82
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
83 static void abs_pow34_v(float *out, const float *in, const int size)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
84 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
85 #ifndef USE_REALLY_FULL_SEARCH
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
86 int i;
9961
c0d721961a7f Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents: 9960
diff changeset
87 for (i = 0; i < size; i++) {
c0d721961a7f Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents: 9960
diff changeset
88 float a = fabsf(in[i]);
c0d721961a7f Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents: 9960
diff changeset
89 out[i] = sqrtf(a * sqrtf(a));
c0d721961a7f Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents: 9960
diff changeset
90 }
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
91 #endif /* USE_REALLY_FULL_SEARCH */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
92 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
93
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
94 static const uint8_t aac_cb_range [12] = {0, 3, 3, 3, 3, 9, 9, 8, 8, 13, 13, 17};
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
95 static const uint8_t aac_cb_maxval[12] = {0, 1, 1, 2, 2, 4, 4, 7, 7, 12, 12, 16};
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
96
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
97 /**
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
98 * Calculate rate distortion cost for quantizing with given codebook
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
99 *
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
100 * @return quantization distortion
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
101 */
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
102 static av_always_inline float quantize_and_encode_band_cost_template(
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
103 struct AACEncContext *s,
11537
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
104 PutBitContext *pb, const float *in,
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
105 const float *scaled, int size, int scale_idx,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
106 int cb, const float lambda, const float uplim,
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
107 int *bits, int BT_ZERO, int BT_UNSIGNED,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
108 int BT_PAIR, int BT_ESC)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
109 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
110 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
111 const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
112 const float CLIPPED_ESCAPE = 165140.0f*IQ;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
113 int i, j, k;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
114 float cost = 0;
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
115 const int dim = BT_PAIR ? 2 : 4;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
116 int resbits = 0;
9961
c0d721961a7f Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents: 9960
diff changeset
117 const float Q34 = sqrtf(Q * sqrtf(Q));
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
118 const int range = aac_cb_range[cb];
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
119 const int maxval = aac_cb_maxval[cb];
11731
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
120 int off;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
121
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
122 if (BT_ZERO) {
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
123 for (i = 0; i < size; i++)
10210
47048ee7db4e aacenc: Multiple distortion by lambda after it's summed and not each individual
alexc
parents: 10209
diff changeset
124 cost += in[i]*in[i];
9957
6fb2be900484 When calculating AAC quantized band cost, don't leave garbage in the bit count
alexc
parents: 9944
diff changeset
125 if (bits)
6fb2be900484 When calculating AAC quantized band cost, don't leave garbage in the bit count
alexc
parents: 9944
diff changeset
126 *bits = 0;
10210
47048ee7db4e aacenc: Multiple distortion by lambda after it's summed and not each individual
alexc
parents: 10209
diff changeset
127 return cost * lambda;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
128 }
11537
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
129 if (!scaled) {
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
130 abs_pow34_v(s->scoefs, in, size);
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
131 scaled = s->scoefs;
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
132 }
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
133 quantize_bands(s->qcoefs, in, scaled, size, Q34, !BT_UNSIGNED, maxval);
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
134 if (BT_UNSIGNED) {
11731
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
135 off = 0;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
136 } else {
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
137 off = maxval;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
138 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
139 for (i = 0; i < size; i += dim) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
140 const float *vec;
11731
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
141 int *quants = s->qcoefs + i;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
142 int curidx = 0;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
143 int curbits;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
144 float rd = 0.0f;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
145 for (j = 0; j < dim; j++) {
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
146 curidx *= range;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
147 curidx += quants[j] + off;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
148 }
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
149 curbits = ff_aac_spectral_bits[cb-1][curidx];
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
150 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim];
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
151 if (BT_UNSIGNED) {
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
152 for (k = 0; k < dim; k++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
153 float t = fabsf(in[i+k]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
154 float di;
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
155 if (BT_ESC && vec[k] == 64.0f) { //FIXME: slow
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
156 if (t >= CLIPPED_ESCAPE) {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
157 di = t - CLIPPED_ESCAPE;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
158 curbits += 21;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
159 } else {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
160 int c = av_clip(quant(t, Q), 0, 8191);
10211
337e5592f985 aacenc: Replace cbrt() with cbrtf() when the result is destined for float
alexc
parents: 10210
diff changeset
161 di = t - c*cbrtf(c)*IQ;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
162 curbits += av_log2(c)*2 - 4 + 1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
163 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
164 } else {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
165 di = t - vec[k]*IQ;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
166 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
167 if (vec[k] != 0.0f)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
168 curbits++;
10210
47048ee7db4e aacenc: Multiple distortion by lambda after it's summed and not each individual
alexc
parents: 10209
diff changeset
169 rd += di*di;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
170 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
171 } else {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
172 for (k = 0; k < dim; k++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
173 float di = in[i+k] - vec[k]*IQ;
10210
47048ee7db4e aacenc: Multiple distortion by lambda after it's summed and not each individual
alexc
parents: 10209
diff changeset
174 rd += di*di;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
175 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
176 }
11731
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
177 cost += rd * lambda + curbits;
73f923159384 aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents: 11730
diff changeset
178 resbits += curbits;
11537
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
179 if (cost >= uplim)
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
180 return uplim;
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
181 if (pb) {
12192
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
182 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]);
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
183 if (BT_UNSIGNED)
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
184 for (j = 0; j < dim; j++)
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
185 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f)
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
186 put_bits(pb, 1, in[i+j] < 0.0f);
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
187 if (BT_ESC) {
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
188 for (j = 0; j < 2; j++) {
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
189 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) {
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
190 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191);
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
191 int len = av_log2(coef);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
192
12192
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
193 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2);
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
194 put_bits(pb, len, coef & ((1 << len) - 1));
8e087b8af4f1 Cosmetics: Whitespace
alexc
parents: 12179
diff changeset
195 }
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
196 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
197 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
198 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
199 }
11537
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
200
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
201 if (bits)
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
202 *bits = resbits;
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
203 return cost;
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
204 }
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
205
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
206 #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC) \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
207 static float quantize_and_encode_band_cost_ ## NAME( \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
208 struct AACEncContext *s, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
209 PutBitContext *pb, const float *in, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
210 const float *scaled, int size, int scale_idx, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
211 int cb, const float lambda, const float uplim, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
212 int *bits) { \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
213 return quantize_and_encode_band_cost_template( \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
214 s, pb, in, scaled, size, scale_idx, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
215 BT_ESC ? ESC_BT : cb, lambda, uplim, bits, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
216 BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC); \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
217 }
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
218
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
219 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ZERO, 1, 0, 0, 0)
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
220 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD, 0, 0, 0, 0)
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
221 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD, 0, 1, 0, 0)
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
222 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR, 0, 0, 1, 0)
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
223 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR, 0, 1, 1, 0)
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
224 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC, 0, 1, 1, 1)
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
225
12179
fca82e8683d4 10l: Add a missing const.
alexc
parents: 12178
diff changeset
226 static float (*const quantize_and_encode_band_cost_arr[])(
12178
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
227 struct AACEncContext *s,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
228 PutBitContext *pb, const float *in,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
229 const float *scaled, int size, int scale_idx,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
230 int cb, const float lambda, const float uplim,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
231 int *bits) = {
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
232 quantize_and_encode_band_cost_ZERO,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
233 quantize_and_encode_band_cost_SQUAD,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
234 quantize_and_encode_band_cost_SQUAD,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
235 quantize_and_encode_band_cost_UQUAD,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
236 quantize_and_encode_band_cost_UQUAD,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
237 quantize_and_encode_band_cost_SPAIR,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
238 quantize_and_encode_band_cost_SPAIR,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
239 quantize_and_encode_band_cost_UPAIR,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
240 quantize_and_encode_band_cost_UPAIR,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
241 quantize_and_encode_band_cost_UPAIR,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
242 quantize_and_encode_band_cost_UPAIR,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
243 quantize_and_encode_band_cost_ESC,
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
244 };
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
245
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
246 #define quantize_and_encode_band_cost( \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
247 s, pb, in, scaled, size, scale_idx, cb, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
248 lambda, uplim, bits) \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
249 quantize_and_encode_band_cost_arr[cb]( \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
250 s, pb, in, scaled, size, scale_idx, cb, \
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
251 lambda, uplim, bits)
b3c39e9d4d3e aacenc: Template quantize_and_encode_band_cost().
alexc
parents: 11997
diff changeset
252
11537
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
253 static float quantize_band_cost(struct AACEncContext *s, const float *in,
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
254 const float *scaled, int size, int scale_idx,
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
255 int cb, const float lambda, const float uplim,
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
256 int *bits)
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
257 {
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
258 return quantize_and_encode_band_cost(s, NULL, in, scaled, size, scale_idx,
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
259 cb, lambda, uplim, bits);
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
260 }
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
261
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
262 static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb,
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
263 const float *in, int size, int scale_idx,
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
264 int cb, const float lambda)
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
265 {
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
266 quantize_and_encode_band_cost(s, pb, in, NULL, size, scale_idx, cb, lambda,
bc0012099ba3 aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents: 10213
diff changeset
267 INFINITY, NULL);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
268 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
269
11764
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
270 static float find_max_val(int group_len, int swb_size, const float *scaled) {
11760
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
271 float maxval = 0.0f;
11764
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
272 int w2, i;
11760
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
273 for (w2 = 0; w2 < group_len; w2++) {
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
274 for (i = 0; i < swb_size; i++) {
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
275 maxval = FFMAX(maxval, scaled[w2*128+i]);
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
276 }
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
277 }
11764
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
278 return maxval;
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
279 }
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
280
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
281 static int find_min_book(float maxval, int sf) {
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
282 float Q = ff_aac_pow2sf_tab[200 - sf + SCALE_ONE_POS - SCALE_DIV_512];
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
283 float Q34 = sqrtf(Q * sqrtf(Q));
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
284 int qmaxval, cb;
11760
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
285 qmaxval = maxval * Q34 + 0.4054f;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
286 if (qmaxval == 0) cb = 0;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
287 else if (qmaxval == 1) cb = 1;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
288 else if (qmaxval == 2) cb = 3;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
289 else if (qmaxval <= 4) cb = 5;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
290 else if (qmaxval <= 7) cb = 7;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
291 else if (qmaxval <= 12) cb = 9;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
292 else cb = 11;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
293 return cb;
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
294 }
2167bf95c596 aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents: 11733
diff changeset
295
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
296 /**
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
297 * structure used in optimal codebook search
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
298 */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
299 typedef struct BandCodingPath {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
300 int prev_idx; ///< pointer to the previous path point
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
301 float cost; ///< path cost
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
302 int run;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
303 } BandCodingPath;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
304
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
305 /**
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
306 * Encode band info for single window group bands.
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
307 */
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
308 static void encode_window_bands_info(AACEncContext *s, SingleChannelElement *sce,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
309 int win, int group_len, const float lambda)
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
310 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
311 BandCodingPath path[120][12];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
312 int w, swb, cb, start, start2, size;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
313 int i, j;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
314 const int max_sfb = sce->ics.max_sfb;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
315 const int run_bits = sce->ics.num_windows == 1 ? 5 : 3;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
316 const int run_esc = (1 << run_bits) - 1;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
317 int idx, ppos, count;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
318 int stackrun[120], stackcb[120], stack_len;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
319 float next_minrd = INFINITY;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
320 int next_mincb = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
321
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
322 abs_pow34_v(s->scoefs, sce->coeffs, 1024);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
323 start = win*128;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
324 for (cb = 0; cb < 12; cb++) {
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
325 path[0][cb].cost = 0.0f;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
326 path[0][cb].prev_idx = -1;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
327 path[0][cb].run = 0;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
328 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
329 for (swb = 0; swb < max_sfb; swb++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
330 start2 = start;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
331 size = sce->ics.swb_sizes[swb];
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
332 if (sce->zeroes[win*16 + swb]) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
333 for (cb = 0; cb < 12; cb++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
334 path[swb+1][cb].prev_idx = cb;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
335 path[swb+1][cb].cost = path[swb][cb].cost;
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
336 path[swb+1][cb].run = path[swb][cb].run + 1;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
337 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
338 } else {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
339 float minrd = next_minrd;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
340 int mincb = next_mincb;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
341 next_minrd = INFINITY;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
342 next_mincb = 0;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
343 for (cb = 0; cb < 12; cb++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
344 float cost_stay_here, cost_get_here;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
345 float rd = 0.0f;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
346 for (w = 0; w < group_len; w++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
347 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(win+w)*16+swb];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
348 rd += quantize_band_cost(s, sce->coeffs + start + w*128,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
349 s->scoefs + start + w*128, size,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
350 sce->sf_idx[(win+w)*16+swb], cb,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
351 lambda / band->threshold, INFINITY, NULL);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
352 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
353 cost_stay_here = path[swb][cb].cost + rd;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
354 cost_get_here = minrd + rd + run_bits + 4;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
355 if ( run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run]
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
356 != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1])
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
357 cost_stay_here += run_bits;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
358 if (cost_get_here < cost_stay_here) {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
359 path[swb+1][cb].prev_idx = mincb;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
360 path[swb+1][cb].cost = cost_get_here;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
361 path[swb+1][cb].run = 1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
362 } else {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
363 path[swb+1][cb].prev_idx = cb;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
364 path[swb+1][cb].cost = cost_stay_here;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
365 path[swb+1][cb].run = path[swb][cb].run + 1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
366 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
367 if (path[swb+1][cb].cost < next_minrd) {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
368 next_minrd = path[swb+1][cb].cost;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
369 next_mincb = cb;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
370 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
371 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
372 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
373 start += sce->ics.swb_sizes[swb];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
374 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
375
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
376 //convert resulting path from backward-linked list
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
377 stack_len = 0;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
378 idx = 0;
9938
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
379 for (cb = 1; cb < 12; cb++)
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
380 if (path[max_sfb][cb].cost < path[max_sfb][idx].cost)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
381 idx = cb;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
382 ppos = max_sfb;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
383 while (ppos > 0) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
384 cb = idx;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
385 stackrun[stack_len] = path[ppos][cb].run;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
386 stackcb [stack_len] = cb;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
387 idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
388 ppos -= path[ppos][cb].run;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
389 stack_len++;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
390 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
391 //perform actual band info encoding
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
392 start = 0;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
393 for (i = stack_len - 1; i >= 0; i--) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
394 put_bits(&s->pb, 4, stackcb[i]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
395 count = stackrun[i];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
396 memset(sce->zeroes + win*16 + start, !stackcb[i], count);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
397 //XXX: memset when band_type is also uint8_t
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
398 for (j = 0; j < count; j++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
399 sce->band_type[win*16 + start] = stackcb[i];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
400 start++;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
401 }
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
402 while (count >= run_esc) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
403 put_bits(&s->pb, run_bits, run_esc);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
404 count -= run_esc;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
405 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
406 put_bits(&s->pb, run_bits, count);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
407 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
408 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
409
11732
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
410 static void codebook_trellis_rate(AACEncContext *s, SingleChannelElement *sce,
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
411 int win, int group_len, const float lambda)
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
412 {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
413 BandCodingPath path[120][12];
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
414 int w, swb, cb, start, start2, size;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
415 int i, j;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
416 const int max_sfb = sce->ics.max_sfb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
417 const int run_bits = sce->ics.num_windows == 1 ? 5 : 3;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
418 const int run_esc = (1 << run_bits) - 1;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
419 int idx, ppos, count;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
420 int stackrun[120], stackcb[120], stack_len;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
421 float next_minrd = INFINITY;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
422 int next_mincb = 0;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
423
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
424 abs_pow34_v(s->scoefs, sce->coeffs, 1024);
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
425 start = win*128;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
426 for (cb = 0; cb < 12; cb++) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
427 path[0][cb].cost = run_bits+4;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
428 path[0][cb].prev_idx = -1;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
429 path[0][cb].run = 0;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
430 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
431 for (swb = 0; swb < max_sfb; swb++) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
432 start2 = start;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
433 size = sce->ics.swb_sizes[swb];
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
434 if (sce->zeroes[win*16 + swb]) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
435 for (cb = 0; cb < 12; cb++) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
436 path[swb+1][cb].prev_idx = cb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
437 path[swb+1][cb].cost = path[swb][cb].cost;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
438 path[swb+1][cb].run = path[swb][cb].run + 1;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
439 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
440 } else {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
441 float minrd = next_minrd;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
442 int mincb = next_mincb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
443 int startcb = sce->band_type[win*16+swb];
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
444 next_minrd = INFINITY;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
445 next_mincb = 0;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
446 for (cb = 0; cb < startcb; cb++) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
447 path[swb+1][cb].cost = 61450;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
448 path[swb+1][cb].prev_idx = -1;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
449 path[swb+1][cb].run = 0;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
450 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
451 for (cb = startcb; cb < 12; cb++) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
452 float cost_stay_here, cost_get_here;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
453 float rd = 0.0f;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
454 for (w = 0; w < group_len; w++) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
455 rd += quantize_band_cost(s, sce->coeffs + start + w*128,
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
456 s->scoefs + start + w*128, size,
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
457 sce->sf_idx[(win+w)*16+swb], cb,
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
458 0, INFINITY, NULL);
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
459 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
460 cost_stay_here = path[swb][cb].cost + rd;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
461 cost_get_here = minrd + rd + run_bits + 4;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
462 if ( run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run]
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
463 != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1])
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
464 cost_stay_here += run_bits;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
465 if (cost_get_here < cost_stay_here) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
466 path[swb+1][cb].prev_idx = mincb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
467 path[swb+1][cb].cost = cost_get_here;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
468 path[swb+1][cb].run = 1;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
469 } else {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
470 path[swb+1][cb].prev_idx = cb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
471 path[swb+1][cb].cost = cost_stay_here;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
472 path[swb+1][cb].run = path[swb][cb].run + 1;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
473 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
474 if (path[swb+1][cb].cost < next_minrd) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
475 next_minrd = path[swb+1][cb].cost;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
476 next_mincb = cb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
477 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
478 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
479 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
480 start += sce->ics.swb_sizes[swb];
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
481 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
482
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
483 //convert resulting path from backward-linked list
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
484 stack_len = 0;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
485 idx = 0;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
486 for (cb = 1; cb < 12; cb++)
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
487 if (path[max_sfb][cb].cost < path[max_sfb][idx].cost)
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
488 idx = cb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
489 ppos = max_sfb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
490 while (ppos > 0) {
12193
0a63bed2a00e aacenc: Convert if () abort() to assert().
alexc
parents: 12192
diff changeset
491 assert(idx >= 0);
11732
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
492 cb = idx;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
493 stackrun[stack_len] = path[ppos][cb].run;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
494 stackcb [stack_len] = cb;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
495 idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
496 ppos -= path[ppos][cb].run;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
497 stack_len++;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
498 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
499 //perform actual band info encoding
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
500 start = 0;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
501 for (i = stack_len - 1; i >= 0; i--) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
502 put_bits(&s->pb, 4, stackcb[i]);
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
503 count = stackrun[i];
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
504 memset(sce->zeroes + win*16 + start, !stackcb[i], count);
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
505 //XXX: memset when band_type is also uint8_t
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
506 for (j = 0; j < count; j++) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
507 sce->band_type[win*16 + start] = stackcb[i];
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
508 start++;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
509 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
510 while (count >= run_esc) {
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
511 put_bits(&s->pb, run_bits, run_esc);
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
512 count -= run_esc;
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
513 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
514 put_bits(&s->pb, run_bits, count);
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
515 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
516 }
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
517
12257
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
518 /** Return the minimum scalefactor where the quantized coef does not clip. */
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
519 static av_always_inline uint8_t coef2minsf(float coef) {
12258
86d6c00756cc aacenc: Favor log2f() and sqrtf() over log2() and sqrt().
alexc
parents: 12257
diff changeset
520 return av_clip_uint8(log2f(coef)*4 - 69 + SCALE_ONE_POS - SCALE_DIV_512);
12257
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
521 }
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
522
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
523 /** Return the maximum scalefactor where the quantized coef is not zero. */
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
524 static av_always_inline uint8_t coef2maxsf(float coef) {
12258
86d6c00756cc aacenc: Favor log2f() and sqrtf() over log2() and sqrt().
alexc
parents: 12257
diff changeset
525 return av_clip_uint8(log2f(coef)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512);
12257
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
526 }
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
527
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
528 typedef struct TrellisPath {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
529 float cost;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
530 int prev;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
531 } TrellisPath;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
532
10213
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
533 #define TRELLIS_STAGES 121
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
534 #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
10213
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
535
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
536 static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s,
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
537 SingleChannelElement *sce,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
538 const float lambda)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
539 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
540 int q, w, w2, g, start = 0;
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
541 int i, j;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
542 int idx;
10213
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
543 TrellisPath paths[TRELLIS_STAGES][TRELLIS_STATES];
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
544 int bandaddr[TRELLIS_STAGES];
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
545 int minq;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
546 float mincost;
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
547 float q0f = FLT_MAX, q1f = 0.0f, qnrgf = 0.0f;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
548 int q0, q1, qcnt = 0;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
549
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
550 for (i = 0; i < 1024; i++) {
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
551 float t = fabsf(sce->coeffs[i]);
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
552 if (t > 0.0f) {
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
553 q0f = FFMIN(q0f, t);
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
554 q1f = FFMAX(q1f, t);
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
555 qnrgf += t*t;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
556 qcnt++;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
557 }
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
558 }
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
559
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
560 if (!qcnt) {
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
561 memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
562 memset(sce->zeroes, 1, sizeof(sce->zeroes));
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
563 return;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
564 }
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
565
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
566 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
12257
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
567 q0 = coef2minsf(q0f);
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
568 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
12257
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
569 q1 = coef2maxsf(q1f);
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
570 //av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
571 if (q1 - q0 > 60) {
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
572 int q0low = q0;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
573 int q1high = q1;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
574 //minimum scalefactor index is when maximum nonzero coefficient after quantizing is not clipped
12258
86d6c00756cc aacenc: Favor log2f() and sqrtf() over log2() and sqrt().
alexc
parents: 12257
diff changeset
575 int qnrg = av_clip_uint8(log2f(sqrtf(qnrgf/qcnt))*4 - 31 + SCALE_ONE_POS - SCALE_DIV_512);
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
576 q1 = qnrg + 30;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
577 q0 = qnrg - 30;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
578 //av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
579 if (q0 < q0low) {
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
580 q1 += q0low - q0;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
581 q0 = q0low;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
582 } else if (q1 > q1high) {
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
583 q0 -= q1 - q1high;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
584 q1 = q1high;
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
585 }
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
586 }
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
587 //av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
588
10213
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
589 for (i = 0; i < TRELLIS_STATES; i++) {
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
590 paths[0][i].cost = 0.0f;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
591 paths[0][i].prev = -1;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
592 }
10213
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
593 for (j = 1; j < TRELLIS_STAGES; j++) {
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
594 for (i = 0; i < TRELLIS_STATES; i++) {
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
595 paths[j][i].cost = INFINITY;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
596 paths[j][i].prev = -2;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
597 }
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
598 }
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
599 idx = 1;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
600 abs_pow34_v(s->scoefs, sce->coeffs, 1024);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
601 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
602 start = w*128;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
603 for (g = 0; g < sce->ics.num_swb; g++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
604 const float *coefs = sce->coeffs + start;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
605 float qmin, qmax;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
606 int nz = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
607
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
608 bandaddr[idx] = w * 16 + g;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
609 qmin = INT_MAX;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
610 qmax = 0.0f;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
611 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
612 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g];
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
613 if (band->energy <= band->threshold || band->threshold == 0.0f) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
614 sce->zeroes[(w+w2)*16+g] = 1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
615 continue;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
616 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
617 sce->zeroes[(w+w2)*16+g] = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
618 nz = 1;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
619 for (i = 0; i < sce->ics.swb_sizes[g]; i++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
620 float t = fabsf(coefs[w2*128+i]);
9938
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
621 if (t > 0.0f)
9944
c5ca5e520fe1 Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents: 9939
diff changeset
622 qmin = FFMIN(qmin, t);
c5ca5e520fe1 Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents: 9939
diff changeset
623 qmax = FFMAX(qmax, t);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
624 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
625 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
626 if (nz) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
627 int minscale, maxscale;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
628 float minrd = INFINITY;
11769
847502a2f850 Fix declaration after statement
alexc
parents: 11764
diff changeset
629 float maxval;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
630 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
12257
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
631 minscale = coef2minsf(qmin);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
632 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
12257
ad42f9293ec6 aacenc: Factorize some scalefactor utilities.
alexc
parents: 12193
diff changeset
633 maxscale = coef2maxsf(qmax);
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
634 minscale = av_clip(minscale - q0, 0, TRELLIS_STATES - 1);
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
635 maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES);
11769
847502a2f850 Fix declaration after statement
alexc
parents: 11764
diff changeset
636 maxval = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], s->scoefs+start);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
637 for (q = minscale; q < maxscale; q++) {
11762
91b9bd17e79c aacenc: Trellis over scalefactors using an estimated codebook rather than every codebook.
alexc
parents: 11761
diff changeset
638 float dist = 0;
11764
e9c024d542f4 aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents: 11763
diff changeset
639 int cb = find_min_book(maxval, sce->sf_idx[w*16+g]);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
640 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
641 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g];
11762
91b9bd17e79c aacenc: Trellis over scalefactors using an estimated codebook rather than every codebook.
alexc
parents: 11761
diff changeset
642 dist += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g],
11793
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
643 q + q0, cb, lambda / band->threshold, INFINITY, NULL);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
644 }
9944
c5ca5e520fe1 Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents: 9939
diff changeset
645 minrd = FFMIN(minrd, dist);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
646
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
647 for (i = 0; i < q1 - q0; i++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
648 float cost;
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
649 cost = paths[idx - 1][i].cost + dist
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
650 + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO];
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
651 if (cost < paths[idx][q].cost) {
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
652 paths[idx][q].cost = cost;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
653 paths[idx][q].prev = i;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
654 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
655 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
656 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
657 } else {
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
658 for (q = 0; q < q1 - q0; q++) {
11793
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
659 paths[idx][q].cost = paths[idx - 1][q].cost + 1;
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
660 paths[idx][q].prev = q;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
661 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
662 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
663 sce->zeroes[w*16+g] = !nz;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
664 start += sce->ics.swb_sizes[g];
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
665 idx++;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
666 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
667 }
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
668 idx--;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
669 mincost = paths[idx][0].cost;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
670 minq = 0;
10213
cebf6e3381e0 aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents: 10212
diff changeset
671 for (i = 1; i < TRELLIS_STATES; i++) {
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
672 if (paths[idx][i].cost < mincost) {
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
673 mincost = paths[idx][i].cost;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
674 minq = i;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
675 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
676 }
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
677 while (idx) {
11761
418455c7e31f aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents: 11760
diff changeset
678 sce->sf_idx[bandaddr[idx]] = minq + q0;
10212
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
679 minq = paths[idx][minq].prev;
4e2db0d76fad aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents: 10211
diff changeset
680 idx--;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
681 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
682 //set the same quantizers inside window groups
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
683 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
684 for (g = 0; g < sce->ics.num_swb; g++)
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
685 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
686 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
687 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
688
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
689 /**
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
690 * two-loop quantizers search taken from ISO 13818-7 Appendix C
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
691 */
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
692 static void search_for_quantizers_twoloop(AVCodecContext *avctx,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
693 AACEncContext *s,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
694 SingleChannelElement *sce,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
695 const float lambda)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
696 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
697 int start = 0, i, w, w2, g;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
698 int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
699 float dists[128], uplims[128];
12265
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
700 float maxvals[128];
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
701 int fflag, minscaler;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
702 int its = 0;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
703 int allz = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
704 float minthr = INFINITY;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
705
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
706 //XXX: some heuristic to determine initial quantizers will reduce search time
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
707 memset(dists, 0, sizeof(dists));
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
708 //determine zero bands and upper limits
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
709 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
710 for (g = 0; g < sce->ics.num_swb; g++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
711 int nz = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
712 float uplim = 0.0f;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
713 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
714 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
715 uplim += band->threshold;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
716 if (band->energy <= band->threshold || band->threshold == 0.0f) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
717 sce->zeroes[(w+w2)*16+g] = 1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
718 continue;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
719 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
720 nz = 1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
721 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
722 uplims[w*16+g] = uplim *512;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
723 sce->zeroes[w*16+g] = !nz;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
724 if (nz)
9944
c5ca5e520fe1 Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents: 9939
diff changeset
725 minthr = FFMIN(minthr, uplim);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
726 allz = FFMAX(allz, nz);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
727 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
728 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
729 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
730 for (g = 0; g < sce->ics.num_swb; g++) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
731 if (sce->zeroes[w*16+g]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
732 sce->sf_idx[w*16+g] = SCALE_ONE_POS;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
733 continue;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
734 }
12258
86d6c00756cc aacenc: Favor log2f() and sqrtf() over log2() and sqrt().
alexc
parents: 12257
diff changeset
735 sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2f(uplims[w*16+g]/minthr)*4,59);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
736 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
737 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
738
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
739 if (!allz)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
740 return;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
741 abs_pow34_v(s->scoefs, sce->coeffs, 1024);
12265
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
742
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
743 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
744 start = w*128;
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
745 for (g = 0; g < sce->ics.num_swb; g++) {
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
746 const float *scaled = s->scoefs + start;
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
747 maxvals[w*16+g] = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled);
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
748 start += sce->ics.swb_sizes[g];
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
749 }
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
750 }
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
751
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
752 //perform two-loop search
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
753 //outer loop - improve quality
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
754 do {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
755 int tbits, qstep;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
756 minscaler = sce->sf_idx[0];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
757 //inner loop - quantize spectrum to fit into given number of bits
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
758 qstep = its ? 1 : 32;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
759 do {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
760 int prev = -1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
761 tbits = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
762 fflag = 0;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
763 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
764 start = w*128;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
765 for (g = 0; g < sce->ics.num_swb; g++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
766 const float *coefs = sce->coeffs + start;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
767 const float *scaled = s->scoefs + start;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
768 int bits = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
769 int cb;
11792
a211c41465f3 aacenc: Remove unnecessary variables and scopes in the TLS.
alexc
parents: 11769
diff changeset
770 float dist = 0.0f;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
771
9971
4b6f16da6652 Be sure to increment our position in the coefficient array when skipping a zero
alexc
parents: 9967
diff changeset
772 if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) {
4b6f16da6652 Be sure to increment our position in the coefficient array when skipping a zero
alexc
parents: 9967
diff changeset
773 start += sce->ics.swb_sizes[g];
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
774 continue;
9971
4b6f16da6652 Be sure to increment our position in the coefficient array when skipping a zero
alexc
parents: 9967
diff changeset
775 }
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
776 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);
12265
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
777 cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
11793
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
778 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
779 int b;
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
780 dist += quantize_band_cost(s, coefs + w2*128,
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
781 scaled + w2*128,
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
782 sce->ics.swb_sizes[g],
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
783 sce->sf_idx[w*16+g],
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
784 cb,
11794
233b2faac076 aacenc: Remove an unnecessary division from the TLS.
alexc
parents: 11793
diff changeset
785 1.0f,
11793
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
786 INFINITY,
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
787 &b);
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
788 bits += b;
9a13275c05c4 Cosmetics: whitespace
alexc
parents: 11792
diff changeset
789 }
11794
233b2faac076 aacenc: Remove an unnecessary division from the TLS.
alexc
parents: 11793
diff changeset
790 dists[w*16+g] = dist - bits;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
791 if (prev != -1) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
792 bits += ff_aac_scalefactor_bits[sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
793 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
794 tbits += bits;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
795 start += sce->ics.swb_sizes[g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
796 prev = sce->sf_idx[w*16+g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
797 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
798 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
799 if (tbits > destbits) {
9938
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
800 for (i = 0; i < 128; i++)
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
801 if (sce->sf_idx[i] < 218 - qstep)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
802 sce->sf_idx[i] += qstep;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
803 } else {
9938
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
804 for (i = 0; i < 128; i++)
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
805 if (sce->sf_idx[i] > 60 - qstep)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
806 sce->sf_idx[i] -= qstep;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
807 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
808 qstep >>= 1;
12261
940736055764 aacenc: Prevent premature termination of the two loop search.
alexc
parents: 12258
diff changeset
809 if (!qstep && tbits > destbits*1.02 && sce->sf_idx[0] < 217)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
810 qstep = 1;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
811 } while (qstep);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
812
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
813 fflag = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
814 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
815 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
816 for (g = 0; g < sce->ics.num_swb; g++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
817 int prevsc = sce->sf_idx[w*16+g];
12263
c7c07caedd2f aacenc: TLS: Try to preserve some energy in each non-zero band.
alexc
parents: 12261
diff changeset
818 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) {
12265
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
819 if (find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1))
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
820 sce->sf_idx[w*16+g]--;
12263
c7c07caedd2f aacenc: TLS: Try to preserve some energy in each non-zero band.
alexc
parents: 12261
diff changeset
821 else //Try to make sure there is some energy in every band
c7c07caedd2f aacenc: TLS: Try to preserve some energy in each non-zero band.
alexc
parents: 12261
diff changeset
822 sce->sf_idx[w*16+g]-=2;
c7c07caedd2f aacenc: TLS: Try to preserve some energy in each non-zero band.
alexc
parents: 12261
diff changeset
823 }
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
824 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
825 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
826 if (sce->sf_idx[w*16+g] != prevsc)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
827 fflag = 1;
12265
b120f1854e35 aacenc: TLS: Save maximum values for each swb in a table.
alexc
parents: 12264
diff changeset
828 sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
829 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
830 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
831 its++;
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
832 } while (fflag && its < 10);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
833 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
834
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
835 static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s,
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
836 SingleChannelElement *sce,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
837 const float lambda)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
838 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
839 int start = 0, i, w, w2, g;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
840 float uplim[128], maxq[128];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
841 int minq, maxsf;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
842 float distfact = ((sce->ics.num_windows > 1) ? 85.80 : 147.84) / lambda;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
843 int last = 0, lastband = 0, curband = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
844 float avg_energy = 0.0;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
845 if (sce->ics.num_windows == 1) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
846 start = 0;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
847 for (i = 0; i < 1024; i++) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
848 if (i - start >= sce->ics.swb_sizes[curband]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
849 start += sce->ics.swb_sizes[curband];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
850 curband++;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
851 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
852 if (sce->coeffs[i]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
853 avg_energy += sce->coeffs[i] * sce->coeffs[i];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
854 last = i;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
855 lastband = curband;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
856 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
857 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
858 } else {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
859 for (w = 0; w < 8; w++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
860 const float *coeffs = sce->coeffs + w*128;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
861 start = 0;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
862 for (i = 0; i < 128; i++) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
863 if (i - start >= sce->ics.swb_sizes[curband]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
864 start += sce->ics.swb_sizes[curband];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
865 curband++;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
866 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
867 if (coeffs[i]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
868 avg_energy += coeffs[i] * coeffs[i];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
869 last = FFMAX(last, i);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
870 lastband = FFMAX(lastband, curband);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
871 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
872 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
873 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
874 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
875 last++;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
876 avg_energy /= last;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
877 if (avg_energy == 0.0f) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
878 for (i = 0; i < FF_ARRAY_ELEMS(sce->sf_idx); i++)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
879 sce->sf_idx[i] = SCALE_ONE_POS;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
880 return;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
881 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
882 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
883 start = w*128;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
884 for (g = 0; g < sce->ics.num_swb; g++) {
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
885 float *coefs = sce->coeffs + start;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
886 const int size = sce->ics.swb_sizes[g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
887 int start2 = start, end2 = start + size, peakpos = start;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
888 float maxval = -1, thr = 0.0f, t;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
889 maxq[w*16+g] = 0.0f;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
890 if (g > lastband) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
891 maxq[w*16+g] = 0.0f;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
892 start += size;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
893 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
894 memset(coefs + w2*128, 0, sizeof(coefs[0])*size);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
895 continue;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
896 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
897 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
898 for (i = 0; i < size; i++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
899 float t = coefs[w2*128+i]*coefs[w2*128+i];
9944
c5ca5e520fe1 Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents: 9939
diff changeset
900 maxq[w*16+g] = FFMAX(maxq[w*16+g], fabsf(coefs[w2*128 + i]));
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
901 thr += t;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
902 if (sce->ics.num_windows == 1 && maxval < t) {
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
903 maxval = t;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
904 peakpos = start+i;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
905 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
906 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
907 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
908 if (sce->ics.num_windows == 1) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
909 start2 = FFMAX(peakpos - 2, start2);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
910 end2 = FFMIN(peakpos + 3, end2);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
911 } else {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
912 start2 -= start;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
913 end2 -= start;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
914 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
915 start += size;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
916 thr = pow(thr / (avg_energy * (end2 - start2)), 0.3 + 0.1*(lastband - g) / lastband);
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
917 t = 1.0 - (1.0 * start2 / last);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
918 uplim[w*16+g] = distfact / (1.4 * thr + t*t*t + 0.075);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
919 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
920 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
921 memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
922 abs_pow34_v(s->scoefs, sce->coeffs, 1024);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
923 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
924 start = w*128;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
925 for (g = 0; g < sce->ics.num_swb; g++) {
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
926 const float *coefs = sce->coeffs + start;
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
927 const float *scaled = s->scoefs + start;
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
928 const int size = sce->ics.swb_sizes[g];
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
929 int scf, prev_scf, step;
11686
41a083a2527a Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents: 11644
diff changeset
930 int min_scf = -1, max_scf = 256;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
931 float curdiff;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
932 if (maxq[w*16+g] < 21.544) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
933 sce->zeroes[w*16+g] = 1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
934 start += size;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
935 continue;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
936 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
937 sce->zeroes[w*16+g] = 0;
12258
86d6c00756cc aacenc: Favor log2f() and sqrtf() over log2() and sqrt().
alexc
parents: 12257
diff changeset
938 scf = prev_scf = av_clip(SCALE_ONE_POS - SCALE_DIV_512 - log2f(1/maxq[w*16+g])*16/3, 60, 218);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
939 step = 16;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
940 for (;;) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
941 float dist = 0.0f;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
942 int quant_max;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
943
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
944 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
945 int b;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
946 dist += quantize_band_cost(s, coefs + w2*128,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
947 scaled + w2*128,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
948 sce->ics.swb_sizes[g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
949 scf,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
950 ESC_BT,
9939
6c5a58b34997 Turn on AAC rate control.
alexc
parents: 9938
diff changeset
951 lambda,
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
952 INFINITY,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
953 &b);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
954 dist -= b;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
955 }
9939
6c5a58b34997 Turn on AAC rate control.
alexc
parents: 9938
diff changeset
956 dist *= 1.0f / 512.0f / lambda;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
957 quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[200 - scf + SCALE_ONE_POS - SCALE_DIV_512]);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
958 if (quant_max >= 8191) { // too much, return to the previous quantizer
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
959 sce->sf_idx[w*16+g] = prev_scf;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
960 break;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
961 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
962 prev_scf = scf;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
963 curdiff = fabsf(dist - uplim[w*16+g]);
11686
41a083a2527a Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents: 11644
diff changeset
964 if (curdiff <= 1.0f)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
965 step = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
966 else
12258
86d6c00756cc aacenc: Favor log2f() and sqrtf() over log2() and sqrt().
alexc
parents: 12257
diff changeset
967 step = log2f(curdiff);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
968 if (dist > uplim[w*16+g])
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
969 step = -step;
11686
41a083a2527a Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents: 11644
diff changeset
970 scf += step;
11688
6f5bee041560 10l: store the result of clipping added in r23035
alexc
parents: 11686
diff changeset
971 scf = av_clip_uint8(scf);
11686
41a083a2527a Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents: 11644
diff changeset
972 step = scf - prev_scf;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
973 if (FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) {
11686
41a083a2527a Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents: 11644
diff changeset
974 sce->sf_idx[w*16+g] = av_clip(scf, min_scf, max_scf);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
975 break;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
976 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
977 if (step > 0)
11686
41a083a2527a Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents: 11644
diff changeset
978 min_scf = prev_scf;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
979 else
11686
41a083a2527a Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents: 11644
diff changeset
980 max_scf = prev_scf;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
981 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
982 start += size;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
983 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
984 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
985 minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
986 for (i = 1; i < 128; i++) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
987 if (!sce->sf_idx[i])
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
988 sce->sf_idx[i] = sce->sf_idx[i-1];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
989 else
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
990 minq = FFMIN(minq, sce->sf_idx[i]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
991 }
9938
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
992 if (minq == INT_MAX)
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
993 minq = 0;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
994 minq = FFMIN(minq, SCALE_MAX_POS);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
995 maxsf = FFMIN(minq + SCALE_MAX_DIFF, SCALE_MAX_POS);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
996 for (i = 126; i >= 0; i--) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
997 if (!sce->sf_idx[i])
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
998 sce->sf_idx[i] = sce->sf_idx[i+1];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
999 sce->sf_idx[i] = av_clip(sce->sf_idx[i], minq, maxsf);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1000 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1001 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1002
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1003 static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s,
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
1004 SingleChannelElement *sce,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
1005 const float lambda)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1006 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1007 int start = 0, i, w, w2, g;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1008 int minq = 255;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1009
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1010 memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1011 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1012 start = w*128;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1013 for (g = 0; g < sce->ics.num_swb; g++) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1014 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1015 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g];
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1016 if (band->energy <= band->threshold) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1017 sce->sf_idx[(w+w2)*16+g] = 218;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1018 sce->zeroes[(w+w2)*16+g] = 1;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1019 } else {
12258
86d6c00756cc aacenc: Favor log2f() and sqrtf() over log2() and sqrt().
alexc
parents: 12257
diff changeset
1020 sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + log2f(band->threshold), 80, 218);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1021 sce->zeroes[(w+w2)*16+g] = 0;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1022 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1023 minq = FFMIN(minq, sce->sf_idx[(w+w2)*16+g]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1024 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1025 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1026 }
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1027 for (i = 0; i < 128; i++) {
9938
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
1028 sce->sf_idx[i] = 140;
6c1ac45b3097 cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents: 9937
diff changeset
1029 //av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1);
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1030 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1031 //set the same quantizers inside window groups
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1032 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1033 for (g = 0; g < sce->ics.num_swb; g++)
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1034 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1035 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1036 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1037
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
1038 static void search_for_ms(AACEncContext *s, ChannelElement *cpe,
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
1039 const float lambda)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1040 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1041 int start = 0, i, w, w2, g;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1042 float M[128], S[128];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1043 float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1044 SingleChannelElement *sce0 = &cpe->ch[0];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1045 SingleChannelElement *sce1 = &cpe->ch[1];
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1046 if (!cpe->common_window)
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1047 return;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1048 for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1049 for (g = 0; g < sce0->ics.num_swb; g++) {
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1050 if (!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1051 float dist1 = 0.0f, dist2 = 0.0f;
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1052 for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1053 FFPsyBand *band0 = &s->psy.psy_bands[(s->cur_channel+0)*PSY_MAX_BANDS+(w+w2)*16+g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1054 FFPsyBand *band1 = &s->psy.psy_bands[(s->cur_channel+1)*PSY_MAX_BANDS+(w+w2)*16+g];
9944
c5ca5e520fe1 Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents: 9939
diff changeset
1055 float minthr = FFMIN(band0->threshold, band1->threshold);
c5ca5e520fe1 Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents: 9939
diff changeset
1056 float maxthr = FFMAX(band0->threshold, band1->threshold);
9936
7f42ae22c351 Cosmetics: Pretty print the AAC encoder.
alexc
parents: 9935
diff changeset
1057 for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1058 M[i] = (sce0->coeffs[start+w2*128+i]
9937
3e39dbd2d9eb cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents: 9936
diff changeset
1059 + sce1->coeffs[start+w2*128+i]) * 0.5;
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1060 S[i] = sce0->coeffs[start+w2*128+i]
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1061 - sce1->coeffs[start+w2*128+i];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1062 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1063 abs_pow34_v(L34, sce0->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1064 abs_pow34_v(R34, sce1->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1065 abs_pow34_v(M34, M, sce0->ics.swb_sizes[g]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1066 abs_pow34_v(S34, S, sce0->ics.swb_sizes[g]);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1067 dist1 += quantize_band_cost(s, sce0->coeffs + start + w2*128,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1068 L34,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1069 sce0->ics.swb_sizes[g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1070 sce0->sf_idx[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1071 sce0->band_type[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1072 lambda / band0->threshold, INFINITY, NULL);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1073 dist1 += quantize_band_cost(s, sce1->coeffs + start + w2*128,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1074 R34,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1075 sce1->ics.swb_sizes[g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1076 sce1->sf_idx[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1077 sce1->band_type[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1078 lambda / band1->threshold, INFINITY, NULL);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1079 dist2 += quantize_band_cost(s, M,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1080 M34,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1081 sce0->ics.swb_sizes[g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1082 sce0->sf_idx[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1083 sce0->band_type[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1084 lambda / maxthr, INFINITY, NULL);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1085 dist2 += quantize_band_cost(s, S,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1086 S34,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1087 sce1->ics.swb_sizes[g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1088 sce1->sf_idx[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1089 sce1->band_type[(w+w2)*16+g],
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1090 lambda / minthr, INFINITY, NULL);
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1091 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1092 cpe->ms_mask[w*16+g] = dist2 < dist1;
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1093 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1094 start += sce0->ics.swb_sizes[g];
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1095 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1096 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1097 }
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1098
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1099 AACCoefficientsEncoder ff_aac_coders[] = {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1100 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1101 search_for_quantizers_faac,
9939
6c5a58b34997 Turn on AAC rate control.
alexc
parents: 9938
diff changeset
1102 encode_window_bands_info,
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1103 quantize_and_encode_band,
10109
68f824761c1b Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents: 9971
diff changeset
1104 search_for_ms,
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1105 },
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1106 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1107 search_for_quantizers_anmr,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1108 encode_window_bands_info,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1109 quantize_and_encode_band,
10109
68f824761c1b Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents: 9971
diff changeset
1110 search_for_ms,
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1111 },
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1112 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1113 search_for_quantizers_twoloop,
11732
c40cc26cd23f aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents: 11731
diff changeset
1114 codebook_trellis_rate,
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1115 quantize_and_encode_band,
10109
68f824761c1b Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents: 9971
diff changeset
1116 search_for_ms,
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1117 },
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1118 {
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1119 search_for_quantizers_fast,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1120 encode_window_bands_info,
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1121 quantize_and_encode_band,
10109
68f824761c1b Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents: 9971
diff changeset
1122 search_for_ms,
9935
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1123 },
d09283aeeef8 Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff changeset
1124 };