Mercurial > libavcodec.hg
annotate aaccoder.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | b120f1854e35 |
children |
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 | 102 static av_always_inline float quantize_and_encode_band_cost_template( |
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 | 107 int *bits, int BT_ZERO, int BT_UNSIGNED, |
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 | 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 | 122 if (BT_ZERO) { |
9936 | 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 | 133 quantize_bands(s->qcoefs, in, scaled, size, Q34, !BT_UNSIGNED, maxval); |
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 | 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 | 151 if (BT_UNSIGNED) { |
9936 | 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 | 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 | 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 | 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 | 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 | 171 } else { |
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 | 182 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]); |
183 if (BT_UNSIGNED) | |
184 for (j = 0; j < dim; j++) | |
185 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f) | |
186 put_bits(pb, 1, in[i+j] < 0.0f); | |
187 if (BT_ESC) { | |
188 for (j = 0; j < 2; j++) { | |
189 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) { | |
190 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191); | |
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 | 193 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); |
194 put_bits(pb, len, coef & ((1 << len) - 1)); | |
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 | 205 |
206 #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC) \ | |
207 static float quantize_and_encode_band_cost_ ## NAME( \ | |
208 struct AACEncContext *s, \ | |
209 PutBitContext *pb, const float *in, \ | |
210 const float *scaled, int size, int scale_idx, \ | |
211 int cb, const float lambda, const float uplim, \ | |
212 int *bits) { \ | |
213 return quantize_and_encode_band_cost_template( \ | |
214 s, pb, in, scaled, size, scale_idx, \ | |
215 BT_ESC ? ESC_BT : cb, lambda, uplim, bits, \ | |
216 BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC); \ | |
217 } | |
218 | |
219 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ZERO, 1, 0, 0, 0) | |
220 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD, 0, 0, 0, 0) | |
221 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD, 0, 1, 0, 0) | |
222 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR, 0, 0, 1, 0) | |
223 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR, 0, 1, 1, 0) | |
224 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC, 0, 1, 1, 1) | |
225 | |
12179 | 226 static float (*const quantize_and_encode_band_cost_arr[])( |
12178 | 227 struct AACEncContext *s, |
228 PutBitContext *pb, const float *in, | |
229 const float *scaled, int size, int scale_idx, | |
230 int cb, const float lambda, const float uplim, | |
231 int *bits) = { | |
232 quantize_and_encode_band_cost_ZERO, | |
233 quantize_and_encode_band_cost_SQUAD, | |
234 quantize_and_encode_band_cost_SQUAD, | |
235 quantize_and_encode_band_cost_UQUAD, | |
236 quantize_and_encode_band_cost_UQUAD, | |
237 quantize_and_encode_band_cost_SPAIR, | |
238 quantize_and_encode_band_cost_SPAIR, | |
239 quantize_and_encode_band_cost_UPAIR, | |
240 quantize_and_encode_band_cost_UPAIR, | |
241 quantize_and_encode_band_cost_UPAIR, | |
242 quantize_and_encode_band_cost_UPAIR, | |
243 quantize_and_encode_band_cost_ESC, | |
244 }; | |
245 | |
246 #define quantize_and_encode_band_cost( \ | |
247 s, pb, in, scaled, size, scale_idx, cb, \ | |
248 lambda, uplim, bits) \ | |
249 quantize_and_encode_band_cost_arr[cb]( \ | |
250 s, pb, in, scaled, size, scale_idx, cb, \ | |
251 lambda, uplim, bits) | |
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 | 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 | 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 | 332 if (sce->zeroes[win*16 + swb]) { |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 518 /** Return the minimum scalefactor where the quantized coef does not clip. */ |
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 | 521 } |
522 | |
523 /** Return the maximum scalefactor where the quantized coef is not zero. */ | |
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 | 526 } |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 636 maxval = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], s->scoefs+start); |
9936 | 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 | 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 | 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 | 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 | 659 paths[idx][q].cost = paths[idx - 1][q].cost + 1; |
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 | 683 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
684 for (g = 0; g < sce->ics.num_swb; g++) | |
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 | 709 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
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 | 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 | 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 | 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 | 729 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
730 for (g = 0; g < sce->ics.num_swb; g++) { | |
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 | 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 | 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 | 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 | 778 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
779 int b; | |
780 dist += quantize_band_cost(s, coefs + w2*128, | |
781 scaled + w2*128, | |
782 sce->ics.swb_sizes[g], | |
783 sce->sf_idx[w*16+g], | |
784 cb, | |
11794
233b2faac076
aacenc: Remove an unnecessary division from the TLS.
alexc
parents:
11793
diff
changeset
|
785 1.0f, |
11793 | 786 INFINITY, |
787 &b); | |
788 bits += b; | |
789 } | |
11794
233b2faac076
aacenc: Remove an unnecessary division from the TLS.
alexc
parents:
11793
diff
changeset
|
790 dists[w*16+g] = dist - bits; |
9936 | 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 | 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 | 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 | 815 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
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 | 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 | 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 | 847 for (i = 0; i < 1024; i++) { |
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 | 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 | 858 } else { |
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 | 862 for (i = 0; i < 128; i++) { |
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 | 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 | 877 if (avg_energy == 0.0f) { |
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 | 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 | 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 | 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 | 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 | 897 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 986 for (i = 1; i < 128; i++) { |
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 | 996 for (i = 126; i >= 0; i--) { |
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 | 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 | 1013 for (g = 0; g < sce->ics.num_swb; g++) { |
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 | 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 | 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 | 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 | 1032 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
1033 for (g = 0; g < sce->ics.num_swb; g++) | |
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 | 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 | 1048 for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) { |
1049 for (g = 0; g < sce0->ics.num_swb; g++) { | |
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 | 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 | 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 | 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 }; |