Mercurial > libavcodec.hg
annotate aaccoder.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
| author | rbultje |
|---|---|
| date | Mon, 19 Jul 2010 22:38:23 +0000 |
| parents | 0a63bed2a00e |
| children | ad42f9293ec6 |
| 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 |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
518 typedef struct TrellisPath { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
519 float cost; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
520 int prev; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
521 } TrellisPath; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
522 |
|
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
523 #define TRELLIS_STAGES 121 |
|
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
524 #define TRELLIS_STATES (SCALE_MAX_DIFF+1) |
|
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
525 |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
526 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
|
527 SingleChannelElement *sce, |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
528 const float lambda) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
529 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
530 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
|
531 int i, j; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
532 int idx; |
|
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
533 TrellisPath paths[TRELLIS_STAGES][TRELLIS_STATES]; |
|
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
534 int bandaddr[TRELLIS_STAGES]; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
535 int minq; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
536 float mincost; |
|
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
537 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
|
538 int q0, q1, qcnt = 0; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
539 |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
540 for (i = 0; i < 1024; i++) { |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
541 float t = fabsf(sce->coeffs[i]); |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
542 if (t > 0.0f) { |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
543 q0f = FFMIN(q0f, t); |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
544 q1f = FFMAX(q1f, t); |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
545 qnrgf += t*t; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
546 qcnt++; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
547 } |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
548 } |
|
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 if (!qcnt) { |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
551 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
|
552 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
|
553 return; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
554 } |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
555 |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
556 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
557 q0 = av_clip_uint8(log2(q0f)*4 - 69 + SCALE_ONE_POS - SCALE_DIV_512); |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
558 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
559 q1 = av_clip_uint8(log2(q1f)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512); |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
560 //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
|
561 if (q1 - q0 > 60) { |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
562 int q0low = q0; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
563 int q1high = q1; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
564 //minimum scalefactor index is when maximum nonzero coefficient after quantizing is not clipped |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
565 int qnrg = av_clip_uint8(log2(sqrt(qnrgf/qcnt))*4 - 31 + SCALE_ONE_POS - SCALE_DIV_512); |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
566 q1 = qnrg + 30; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
567 q0 = qnrg - 30; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
568 //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
|
569 if (q0 < q0low) { |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
570 q1 += q0low - q0; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
571 q0 = q0low; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
572 } else if (q1 > q1high) { |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
573 q0 -= q1 - q1high; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
574 q1 = q1high; |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
575 } |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
576 } |
|
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
577 //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
|
578 |
|
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
579 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
|
580 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
|
581 paths[0][i].prev = -1; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
582 } |
|
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
583 for (j = 1; j < TRELLIS_STAGES; j++) { |
|
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
584 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
|
585 paths[j][i].cost = INFINITY; |
|
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
586 paths[j][i].prev = -2; |
|
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
587 } |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
588 } |
|
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
589 idx = 1; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
590 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 9936 | 591 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
|
592 start = w*128; |
| 9936 | 593 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
|
594 const float *coefs = sce->coeffs + start; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
595 float qmin, qmax; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
596 int nz = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
597 |
|
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
598 bandaddr[idx] = w * 16 + g; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
599 qmin = INT_MAX; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
600 qmax = 0.0f; |
| 9936 | 601 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
|
602 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 9936 | 603 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
|
604 sce->zeroes[(w+w2)*16+g] = 1; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
605 continue; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
606 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
607 sce->zeroes[(w+w2)*16+g] = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
608 nz = 1; |
| 9936 | 609 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
|
610 float t = fabsf(coefs[w2*128+i]); |
|
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
611 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
|
612 qmin = FFMIN(qmin, t); |
|
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
613 qmax = FFMAX(qmax, t); |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
614 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
615 } |
| 9936 | 616 if (nz) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
617 int minscale, maxscale; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
618 float minrd = INFINITY; |
| 11769 | 619 float maxval; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
620 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
621 minscale = av_clip_uint8(log2(qmin)*4 - 69 + SCALE_ONE_POS - SCALE_DIV_512); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
622 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
623 maxscale = av_clip_uint8(log2(qmax)*4 + 6 + 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
|
624 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
|
625 maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES); |
| 11769 | 626 maxval = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], s->scoefs+start); |
| 9936 | 627 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
|
628 float dist = 0; |
|
11764
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
629 int cb = find_min_book(maxval, sce->sf_idx[w*16+g]); |
| 9936 | 630 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
|
631 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
|
632 dist += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g], |
| 11793 | 633 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
|
634 } |
|
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
635 minrd = FFMIN(minrd, dist); |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
636 |
|
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
637 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
|
638 float cost; |
|
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
639 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
|
640 + 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
|
641 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
|
642 paths[idx][q].cost = cost; |
|
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
643 paths[idx][q].prev = i; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
644 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
645 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
646 } |
| 9936 | 647 } else { |
|
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
648 for (q = 0; q < q1 - q0; q++) { |
| 11793 | 649 paths[idx][q].cost = paths[idx - 1][q].cost + 1; |
| 650 paths[idx][q].prev = q; | |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
651 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
652 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
653 sce->zeroes[w*16+g] = !nz; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
654 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
|
655 idx++; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
656 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
657 } |
|
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
658 idx--; |
|
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
659 mincost = paths[idx][0].cost; |
|
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
660 minq = 0; |
|
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
661 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
|
662 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
|
663 mincost = paths[idx][i].cost; |
|
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
664 minq = i; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
665 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
666 } |
|
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
667 while (idx) { |
|
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
668 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
|
669 minq = paths[idx][minq].prev; |
|
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
670 idx--; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
671 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
672 //set the same quantizers inside window groups |
| 9936 | 673 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
| 674 for (g = 0; g < sce->ics.num_swb; g++) | |
| 675 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
|
676 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
|
677 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
678 |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
679 /** |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
680 * 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
|
681 */ |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
682 static void search_for_quantizers_twoloop(AVCodecContext *avctx, |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
683 AACEncContext *s, |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
684 SingleChannelElement *sce, |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
685 const float lambda) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
686 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
687 int start = 0, i, w, w2, g; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
688 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
|
689 float dists[128], uplims[128]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
690 int fflag, minscaler; |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
691 int its = 0; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
692 int allz = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
693 float minthr = INFINITY; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
694 |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
695 //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
|
696 memset(dists, 0, sizeof(dists)); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
697 //determine zero bands and upper limits |
| 9936 | 698 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 699 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
|
700 int nz = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
701 float uplim = 0.0f; |
| 9936 | 702 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
|
703 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
|
704 uplim += band->threshold; |
| 9936 | 705 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
|
706 sce->zeroes[(w+w2)*16+g] = 1; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
707 continue; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
708 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
709 nz = 1; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
710 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
711 uplims[w*16+g] = uplim *512; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
712 sce->zeroes[w*16+g] = !nz; |
| 9936 | 713 if (nz) |
|
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
714 minthr = FFMIN(minthr, uplim); |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
715 allz = FFMAX(allz, nz); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
716 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
717 } |
| 9936 | 718 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 719 for (g = 0; g < sce->ics.num_swb; g++) { | |
| 720 if (sce->zeroes[w*16+g]) { | |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
721 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
|
722 continue; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
723 } |
|
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
724 sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2(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
|
725 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
726 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
727 |
| 9936 | 728 if (!allz) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
729 return; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
730 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
|
731 //perform two-loop search |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
732 //outer loop - improve quality |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
733 do { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
734 int tbits, qstep; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
735 minscaler = sce->sf_idx[0]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
736 //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
|
737 qstep = its ? 1 : 32; |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
738 do { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
739 int prev = -1; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
740 tbits = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
741 fflag = 0; |
| 9936 | 742 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
|
743 start = w*128; |
| 9936 | 744 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
|
745 const float *coefs = sce->coeffs + start; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
746 const float *scaled = s->scoefs + start; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
747 int bits = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
748 int cb; |
|
11792
a211c41465f3
aacenc: Remove unnecessary variables and scopes in the TLS.
alexc
parents:
11769
diff
changeset
|
749 float dist = 0.0f; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
750 |
|
9971
4b6f16da6652
Be sure to increment our position in the coefficient array when skipping a zero
alexc
parents:
9967
diff
changeset
|
751 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
|
752 start += sce->ics.swb_sizes[g]; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
753 continue; |
|
9971
4b6f16da6652
Be sure to increment our position in the coefficient array when skipping a zero
alexc
parents:
9967
diff
changeset
|
754 } |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
755 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); |
| 11793 | 756 cb = find_min_book(find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled), sce->sf_idx[w*16+g]); |
| 757 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { | |
| 758 int b; | |
| 759 dist += quantize_band_cost(s, coefs + w2*128, | |
| 760 scaled + w2*128, | |
| 761 sce->ics.swb_sizes[g], | |
| 762 sce->sf_idx[w*16+g], | |
| 763 cb, | |
|
11794
233b2faac076
aacenc: Remove an unnecessary division from the TLS.
alexc
parents:
11793
diff
changeset
|
764 1.0f, |
| 11793 | 765 INFINITY, |
| 766 &b); | |
| 767 bits += b; | |
| 768 } | |
|
11794
233b2faac076
aacenc: Remove an unnecessary division from the TLS.
alexc
parents:
11793
diff
changeset
|
769 dists[w*16+g] = dist - bits; |
| 9936 | 770 if (prev != -1) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
771 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
|
772 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
773 tbits += bits; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
774 start += sce->ics.swb_sizes[g]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
775 prev = sce->sf_idx[w*16+g]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
776 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
777 } |
| 9936 | 778 if (tbits > destbits) { |
|
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
779 for (i = 0; i < 128; i++) |
|
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
780 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
|
781 sce->sf_idx[i] += qstep; |
| 9936 | 782 } else { |
|
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
783 for (i = 0; i < 128; i++) |
|
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
784 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
|
785 sce->sf_idx[i] -= qstep; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
786 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
787 qstep >>= 1; |
| 9936 | 788 if (!qstep && tbits > destbits*1.02) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
789 qstep = 1; |
|
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
790 if (sce->sf_idx[0] >= 217) |
|
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
791 break; |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
792 } while (qstep); |
|
9935
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 fflag = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
795 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); |
| 9936 | 796 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
|
797 start = w*128; |
| 9936 | 798 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
|
799 int prevsc = sce->sf_idx[w*16+g]; |
|
11997
081702713f47
aacenc: Fill in the estimated codebook for the final computed scalefactor in the TLS.
alexc
parents:
11794
diff
changeset
|
800 const float *scaled = s->scoefs + start; |
| 9936 | 801 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
802 sce->sf_idx[w*16+g]--; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
803 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
|
804 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219); |
| 9936 | 805 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
|
806 fflag = 1; |
|
11997
081702713f47
aacenc: Fill in the estimated codebook for the final computed scalefactor in the TLS.
alexc
parents:
11794
diff
changeset
|
807 sce->band_type[w*16+g] = find_min_book(find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled), sce->sf_idx[w*16+g]); |
|
081702713f47
aacenc: Fill in the estimated codebook for the final computed scalefactor in the TLS.
alexc
parents:
11794
diff
changeset
|
808 start += sce->ics.swb_sizes[g]; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
809 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
810 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
811 its++; |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
812 } while (fflag && its < 10); |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
813 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
814 |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
815 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
|
816 SingleChannelElement *sce, |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
817 const float lambda) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
818 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
819 int start = 0, i, w, w2, g; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
820 float uplim[128], maxq[128]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
821 int minq, maxsf; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
822 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
|
823 int last = 0, lastband = 0, curband = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
824 float avg_energy = 0.0; |
| 9936 | 825 if (sce->ics.num_windows == 1) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
826 start = 0; |
| 9936 | 827 for (i = 0; i < 1024; i++) { |
| 828 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
|
829 start += sce->ics.swb_sizes[curband]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
830 curband++; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
831 } |
| 9936 | 832 if (sce->coeffs[i]) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
833 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
|
834 last = i; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
835 lastband = curband; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
836 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
837 } |
| 9936 | 838 } else { |
| 839 for (w = 0; w < 8; w++) { | |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
840 const float *coeffs = sce->coeffs + w*128; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
841 start = 0; |
| 9936 | 842 for (i = 0; i < 128; i++) { |
| 843 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
|
844 start += sce->ics.swb_sizes[curband]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
845 curband++; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
846 } |
| 9936 | 847 if (coeffs[i]) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
848 avg_energy += coeffs[i] * coeffs[i]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
849 last = FFMAX(last, i); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
850 lastband = FFMAX(lastband, curband); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
851 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
852 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
853 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
854 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
855 last++; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
856 avg_energy /= last; |
| 9936 | 857 if (avg_energy == 0.0f) { |
| 858 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
|
859 sce->sf_idx[i] = SCALE_ONE_POS; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
860 return; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
861 } |
| 9936 | 862 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
|
863 start = w*128; |
| 9936 | 864 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
|
865 float *coefs = sce->coeffs + start; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
866 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
|
867 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
|
868 float maxval = -1, thr = 0.0f, t; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
869 maxq[w*16+g] = 0.0f; |
| 9936 | 870 if (g > lastband) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
871 maxq[w*16+g] = 0.0f; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
872 start += size; |
| 9936 | 873 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
|
874 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
|
875 continue; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
876 } |
| 9936 | 877 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 878 for (i = 0; i < size; i++) { | |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
879 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
|
880 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
|
881 thr += t; |
| 9936 | 882 if (sce->ics.num_windows == 1 && maxval < t) { |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
883 maxval = t; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
884 peakpos = start+i; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
885 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
886 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
887 } |
| 9936 | 888 if (sce->ics.num_windows == 1) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
889 start2 = FFMAX(peakpos - 2, start2); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
890 end2 = FFMIN(peakpos + 3, end2); |
| 9936 | 891 } else { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
892 start2 -= start; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
893 end2 -= start; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
894 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
895 start += size; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
896 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
|
897 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
|
898 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
|
899 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
900 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
901 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
|
902 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 9936 | 903 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
|
904 start = w*128; |
| 9936 | 905 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
|
906 const float *coefs = sce->coeffs + start; |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
907 const float *scaled = s->scoefs + start; |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
908 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
|
909 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
|
910 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
|
911 float curdiff; |
| 9936 | 912 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
|
913 sce->zeroes[w*16+g] = 1; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
914 start += size; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
915 continue; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
916 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
917 sce->zeroes[w*16+g] = 0; |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
918 scf = prev_scf = av_clip(SCALE_ONE_POS - SCALE_DIV_512 - log2(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
|
919 step = 16; |
| 9936 | 920 for (;;) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
921 float dist = 0.0f; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
922 int quant_max; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
923 |
| 9936 | 924 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
|
925 int b; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
926 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
|
927 scaled + w2*128, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
928 sce->ics.swb_sizes[g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
929 scf, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
930 ESC_BT, |
| 9939 | 931 lambda, |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
932 INFINITY, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
933 &b); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
934 dist -= b; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
935 } |
| 9939 | 936 dist *= 1.0f / 512.0f / lambda; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
937 quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[200 - scf + SCALE_ONE_POS - SCALE_DIV_512]); |
| 9936 | 938 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
|
939 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
|
940 break; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
941 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
942 prev_scf = scf; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
943 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
|
944 if (curdiff <= 1.0f) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
945 step = 0; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
946 else |
|
11686
41a083a2527a
Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents:
11644
diff
changeset
|
947 step = log2(curdiff); |
| 9936 | 948 if (dist > uplim[w*16+g]) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
949 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
|
950 scf += step; |
| 11688 | 951 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
|
952 step = scf - prev_scf; |
| 9936 | 953 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
|
954 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
|
955 break; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
956 } |
| 9936 | 957 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
|
958 min_scf = prev_scf; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
959 else |
|
11686
41a083a2527a
Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents:
11644
diff
changeset
|
960 max_scf = prev_scf; |
|
9935
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 start += size; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
963 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
964 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
965 minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX; |
| 9936 | 966 for (i = 1; i < 128; i++) { |
| 967 if (!sce->sf_idx[i]) | |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
968 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
|
969 else |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
970 minq = FFMIN(minq, sce->sf_idx[i]); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
971 } |
|
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
972 if (minq == INT_MAX) |
|
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
973 minq = 0; |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
974 minq = FFMIN(minq, SCALE_MAX_POS); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
975 maxsf = FFMIN(minq + SCALE_MAX_DIFF, SCALE_MAX_POS); |
| 9936 | 976 for (i = 126; i >= 0; i--) { |
| 977 if (!sce->sf_idx[i]) | |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
978 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
|
979 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
|
980 } |
|
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 |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
983 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
|
984 SingleChannelElement *sce, |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
985 const float lambda) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
986 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
987 int start = 0, i, w, w2, g; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
988 int minq = 255; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
989 |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
990 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); |
| 9936 | 991 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
|
992 start = w*128; |
| 9936 | 993 for (g = 0; g < sce->ics.num_swb; g++) { |
| 994 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
|
995 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 9936 | 996 if (band->energy <= band->threshold) { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
997 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
|
998 sce->zeroes[(w+w2)*16+g] = 1; |
| 9936 | 999 } else { |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1000 sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + log2(band->threshold), 80, 218); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1001 sce->zeroes[(w+w2)*16+g] = 0; |
|
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 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
|
1004 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1005 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1006 } |
| 9936 | 1007 for (i = 0; i < 128; i++) { |
|
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
1008 sce->sf_idx[i] = 140; |
|
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
1009 //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
|
1010 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1011 //set the same quantizers inside window groups |
| 9936 | 1012 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
| 1013 for (g = 0; g < sce->ics.num_swb; g++) | |
| 1014 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
|
1015 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
|
1016 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1017 |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
1018 static void search_for_ms(AACEncContext *s, ChannelElement *cpe, |
|
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
1019 const float lambda) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1020 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1021 int start = 0, i, w, w2, g; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1022 float M[128], S[128]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1023 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
|
1024 SingleChannelElement *sce0 = &cpe->ch[0]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1025 SingleChannelElement *sce1 = &cpe->ch[1]; |
| 9936 | 1026 if (!cpe->common_window) |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1027 return; |
| 9936 | 1028 for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) { |
| 1029 for (g = 0; g < sce0->ics.num_swb; g++) { | |
| 1030 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
|
1031 float dist1 = 0.0f, dist2 = 0.0f; |
| 9936 | 1032 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
|
1033 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
|
1034 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
|
1035 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
|
1036 float maxthr = FFMAX(band0->threshold, band1->threshold); |
| 9936 | 1037 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
|
1038 M[i] = (sce0->coeffs[start+w2*128+i] |
|
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
1039 + 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
|
1040 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
|
1041 - sce1->coeffs[start+w2*128+i]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1042 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1043 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
|
1044 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
|
1045 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
|
1046 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
|
1047 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
|
1048 L34, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1049 sce0->ics.swb_sizes[g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1050 sce0->sf_idx[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1051 sce0->band_type[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1052 lambda / band0->threshold, INFINITY, NULL); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1053 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
|
1054 R34, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1055 sce1->ics.swb_sizes[g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1056 sce1->sf_idx[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1057 sce1->band_type[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1058 lambda / band1->threshold, INFINITY, NULL); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1059 dist2 += quantize_band_cost(s, M, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1060 M34, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1061 sce0->ics.swb_sizes[g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1062 sce0->sf_idx[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1063 sce0->band_type[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1064 lambda / maxthr, INFINITY, NULL); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1065 dist2 += quantize_band_cost(s, S, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1066 S34, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1067 sce1->ics.swb_sizes[g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1068 sce1->sf_idx[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1069 sce1->band_type[(w+w2)*16+g], |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1070 lambda / minthr, INFINITY, NULL); |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1071 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1072 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
|
1073 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1074 start += sce0->ics.swb_sizes[g]; |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1075 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1076 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1077 } |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1078 |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1079 AACCoefficientsEncoder ff_aac_coders[] = { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1080 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1081 search_for_quantizers_faac, |
| 9939 | 1082 encode_window_bands_info, |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1083 quantize_and_encode_band, |
|
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1084 search_for_ms, |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1085 }, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1086 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1087 search_for_quantizers_anmr, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1088 encode_window_bands_info, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1089 quantize_and_encode_band, |
|
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1090 search_for_ms, |
|
9935
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 { |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1093 search_for_quantizers_twoloop, |
|
11732
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
1094 codebook_trellis_rate, |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1095 quantize_and_encode_band, |
|
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1096 search_for_ms, |
|
9935
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 search_for_quantizers_fast, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1100 encode_window_bands_info, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1101 quantize_and_encode_band, |
|
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1102 search_for_ms, |
|
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1103 }, |
|
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1104 }; |
