Mercurial > libavcodec.hg
annotate aaccoder.c @ 12043:f9a0bd0888a4 libavcodec
mpegaudio: call ff_mpegaudiodec_init_mmx() only from float decoder
The mmx code is floating-point only, and this function does not know
from which decoder it is called. Without this change, the integer
decoder only "works" because the size of the context struct is smaller
in this case, and the mmx init function writes the function pointer
outside the allocated context.
author | mru |
---|---|
date | Thu, 01 Jul 2010 23:21:17 +0000 |
parents | 081702713f47 |
children | b3c39e9d4d3e |
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 */ |
11537
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
102 static float quantize_and_encode_band_cost(struct AACEncContext *s, |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
103 PutBitContext *pb, const float *in, |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
104 const float *scaled, int size, int scale_idx, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
105 int cb, const float lambda, const float uplim, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
106 int *bits) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
107 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
108 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
|
109 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
|
110 const float CLIPPED_ESCAPE = 165140.0f*IQ; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
111 int i, j, k; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
112 float cost = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
113 const int dim = cb < FIRST_PAIR_BT ? 4 : 2; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
114 int resbits = 0; |
9961
c0d721961a7f
Replace pow(x, 0.75) with sqrtf(x * sqrtf(x)) for a 33% speedup.
alexc
parents:
9960
diff
changeset
|
115 const float Q34 = sqrtf(Q * sqrtf(Q)); |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
116 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
|
117 const int maxval = aac_cb_maxval[cb]; |
11731
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
118 int off; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
119 |
9936 | 120 if (!cb) { |
121 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
|
122 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
|
123 if (bits) |
6fb2be900484
When calculating AAC quantized band cost, don't leave garbage in the bit count
alexc
parents:
9944
diff
changeset
|
124 *bits = 0; |
10210
47048ee7db4e
aacenc: Multiple distortion by lambda after it's summed and not each individual
alexc
parents:
10209
diff
changeset
|
125 return cost * lambda; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
126 } |
11537
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
127 if (!scaled) { |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
128 abs_pow34_v(s->scoefs, in, size); |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
129 scaled = s->scoefs; |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
130 } |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
131 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); |
11731
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
132 if (IS_CODEBOOK_UNSIGNED(cb)) { |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
133 off = 0; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
134 } else { |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
135 off = maxval; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
136 } |
9936 | 137 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
|
138 const float *vec; |
11731
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
139 int *quants = s->qcoefs + i; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
140 int curidx = 0; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
141 int curbits; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
142 float rd = 0.0f; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
143 for (j = 0; j < dim; j++) { |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
144 curidx *= range; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
145 curidx += quants[j] + off; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
146 } |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
147 curbits = ff_aac_spectral_bits[cb-1][curidx]; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
148 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; |
9936 | 149 if (IS_CODEBOOK_UNSIGNED(cb)) { |
150 for (k = 0; k < dim; k++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
151 float t = fabsf(in[i+k]); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
152 float di; |
10208
39285535090c
aacenc: Don't make unnecessary compares to the escape value in tight loops.
alexc
parents:
10109
diff
changeset
|
153 if (vec[k] == 64.0f) { //FIXME: slow |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
154 if (t >= CLIPPED_ESCAPE) { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
155 di = t - CLIPPED_ESCAPE; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
156 curbits += 21; |
9936 | 157 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
158 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
|
159 di = t - c*cbrtf(c)*IQ; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
160 curbits += av_log2(c)*2 - 4 + 1; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
161 } |
9936 | 162 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
163 di = t - vec[k]*IQ; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
164 } |
9936 | 165 if (vec[k] != 0.0f) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
166 curbits++; |
10210
47048ee7db4e
aacenc: Multiple distortion by lambda after it's summed and not each individual
alexc
parents:
10209
diff
changeset
|
167 rd += di*di; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
168 } |
9936 | 169 } else { |
170 for (k = 0; k < dim; k++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
171 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
|
172 rd += di*di; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
173 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
174 } |
11731
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
175 cost += rd * lambda + curbits; |
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
176 resbits += curbits; |
11537
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
177 if (cost >= uplim) |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
178 return uplim; |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
179 if (pb) { |
11731
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
180 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]); |
9936 | 181 if (IS_CODEBOOK_UNSIGNED(cb)) |
182 for (j = 0; j < dim; j++) | |
11731
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
183 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
184 put_bits(pb, 1, in[i+j] < 0.0f); |
9936 | 185 if (cb == ESC_BT) { |
186 for (j = 0; j < 2; j++) { | |
11731
73f923159384
aacenc: Use exact values when quantizing, not fuzzy values.
alexc
parents:
11730
diff
changeset
|
187 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
188 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
189 int len = av_log2(coef); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
190 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
191 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
192 put_bits(pb, len, coef & ((1 << len) - 1)); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
193 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
194 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
195 } |
11537
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
196 } |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
197 } |
11537
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
198 |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
199 if (bits) |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
200 *bits = resbits; |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
201 return cost; |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
202 } |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
203 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
|
204 const float *scaled, int size, int scale_idx, |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
205 int cb, const float lambda, const float uplim, |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
206 int *bits) |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
207 { |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
208 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
|
209 cb, lambda, uplim, bits); |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
210 } |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
211 |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
212 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
|
213 const float *in, int size, int scale_idx, |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
214 int cb, const float lambda) |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
215 { |
bc0012099ba3
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
alexc
parents:
10213
diff
changeset
|
216 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
|
217 INFINITY, NULL); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
218 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
219 |
11764
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
220 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
|
221 float maxval = 0.0f; |
11764
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
222 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
|
223 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
|
224 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
|
225 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
|
226 } |
2167bf95c596
aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents:
11733
diff
changeset
|
227 } |
11764
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
228 return maxval; |
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
229 } |
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
230 |
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
231 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
|
232 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
|
233 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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
239 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
|
240 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
|
241 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
|
242 else cb = 11; |
2167bf95c596
aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents:
11733
diff
changeset
|
243 return cb; |
2167bf95c596
aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents:
11733
diff
changeset
|
244 } |
2167bf95c596
aacenc: Factor out find_min_book so it can be used by multiple coefficient coders.
alexc
parents:
11733
diff
changeset
|
245 |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
246 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
247 * structure used in optimal codebook search |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
248 */ |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
249 typedef struct BandCodingPath { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
250 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
|
251 float cost; ///< path cost |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
252 int run; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
253 } BandCodingPath; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
254 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
255 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
256 * 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
|
257 */ |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
258 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
|
259 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
|
260 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
261 BandCodingPath path[120][12]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
262 int w, swb, cb, start, start2, size; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
263 int i, j; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
264 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
|
265 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
|
266 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
|
267 int idx, ppos, count; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
268 int stackrun[120], stackcb[120], stack_len; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
269 float next_minrd = INFINITY; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
270 int next_mincb = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
271 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
272 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
|
273 start = win*128; |
9936 | 274 for (cb = 0; cb < 12; cb++) { |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
275 path[0][cb].cost = 0.0f; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
276 path[0][cb].prev_idx = -1; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
277 path[0][cb].run = 0; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
278 } |
9936 | 279 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
|
280 start2 = start; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
281 size = sce->ics.swb_sizes[swb]; |
9936 | 282 if (sce->zeroes[win*16 + swb]) { |
283 for (cb = 0; cb < 12; cb++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
284 path[swb+1][cb].prev_idx = cb; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
285 path[swb+1][cb].cost = path[swb][cb].cost; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
286 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
|
287 } |
9936 | 288 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
289 float minrd = next_minrd; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
290 int mincb = next_mincb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
291 next_minrd = INFINITY; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
292 next_mincb = 0; |
9936 | 293 for (cb = 0; cb < 12; cb++) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
294 float cost_stay_here, cost_get_here; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
295 float rd = 0.0f; |
9936 | 296 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
|
297 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
|
298 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
|
299 s->scoefs + start + w*128, size, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
300 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
|
301 lambda / band->threshold, INFINITY, NULL); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
302 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
303 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
|
304 cost_get_here = minrd + rd + run_bits + 4; |
9936 | 305 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
|
306 != 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
|
307 cost_stay_here += run_bits; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
308 if (cost_get_here < cost_stay_here) { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
309 path[swb+1][cb].prev_idx = mincb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
310 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
|
311 path[swb+1][cb].run = 1; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
312 } else { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
313 path[swb+1][cb].prev_idx = cb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
314 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
|
315 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
|
316 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
317 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
|
318 next_minrd = path[swb+1][cb].cost; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
319 next_mincb = cb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
320 } |
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 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
323 start += sce->ics.swb_sizes[swb]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
324 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
325 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
326 //convert resulting path from backward-linked list |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
327 stack_len = 0; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
328 idx = 0; |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
329 for (cb = 1; cb < 12; cb++) |
9936 | 330 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
|
331 idx = cb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
332 ppos = max_sfb; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
333 while (ppos > 0) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
334 cb = idx; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
335 stackrun[stack_len] = path[ppos][cb].run; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
336 stackcb [stack_len] = cb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
337 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
|
338 ppos -= path[ppos][cb].run; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
339 stack_len++; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
340 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
341 //perform actual band info encoding |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
342 start = 0; |
9936 | 343 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
|
344 put_bits(&s->pb, 4, stackcb[i]); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
345 count = stackrun[i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
346 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
|
347 //XXX: memset when band_type is also uint8_t |
9936 | 348 for (j = 0; j < count; j++) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
349 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
|
350 start++; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
351 } |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
352 while (count >= run_esc) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
353 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
|
354 count -= run_esc; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
355 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
356 put_bits(&s->pb, run_bits, count); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
357 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
358 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
359 |
11732
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
360 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
|
361 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
|
362 { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
363 BandCodingPath path[120][12]; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
364 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
|
365 int i, j; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
366 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
|
367 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
|
368 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
|
369 int idx, ppos, count; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
370 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
|
371 float next_minrd = INFINITY; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
372 int next_mincb = 0; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
373 |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
374 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
|
375 start = win*128; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
376 for (cb = 0; cb < 12; cb++) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
377 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
|
378 path[0][cb].prev_idx = -1; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
379 path[0][cb].run = 0; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
380 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
381 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
|
382 start2 = start; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
383 size = sce->ics.swb_sizes[swb]; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
384 if (sce->zeroes[win*16 + swb]) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
385 for (cb = 0; cb < 12; cb++) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
386 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
|
387 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
|
388 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
|
389 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
390 } else { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
391 float minrd = next_minrd; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
392 int mincb = next_mincb; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
393 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
|
394 next_minrd = INFINITY; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
395 next_mincb = 0; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
396 for (cb = 0; cb < startcb; cb++) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
397 path[swb+1][cb].cost = 61450; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
398 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
|
399 path[swb+1][cb].run = 0; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
400 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
401 for (cb = startcb; cb < 12; cb++) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
402 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
|
403 float rd = 0.0f; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
404 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
|
405 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
|
406 s->scoefs + start + w*128, size, |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
407 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
|
408 0, INFINITY, NULL); |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
409 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
410 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
|
411 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
|
412 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
|
413 != 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
|
414 cost_stay_here += run_bits; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 path[swb+1][cb].run = 1; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
419 } else { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
420 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
|
421 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
|
422 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
|
423 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
424 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
|
425 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
|
426 next_mincb = cb; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
427 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
428 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
429 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
430 start += sce->ics.swb_sizes[swb]; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
431 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
432 |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
433 //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
|
434 stack_len = 0; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
435 idx = 0; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
436 for (cb = 1; cb < 12; cb++) |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
437 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
|
438 idx = cb; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
439 ppos = max_sfb; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
440 while (ppos > 0) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
441 if (idx < 0) abort(); |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
442 cb = idx; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
443 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
|
444 stackcb [stack_len] = cb; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
445 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
|
446 ppos -= path[ppos][cb].run; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
447 stack_len++; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
448 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
449 //perform actual band info encoding |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
450 start = 0; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
451 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
|
452 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
|
453 count = stackrun[i]; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
454 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
|
455 //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
|
456 for (j = 0; j < count; j++) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
457 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
|
458 start++; |
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 while (count >= run_esc) { |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
461 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
|
462 count -= run_esc; |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
463 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
464 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
|
465 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
466 } |
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
467 |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
468 typedef struct TrellisPath { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
469 float cost; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
470 int prev; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
471 } TrellisPath; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
472 |
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
473 #define TRELLIS_STAGES 121 |
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
474 #define TRELLIS_STATES (SCALE_MAX_DIFF+1) |
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
475 |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
476 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
|
477 SingleChannelElement *sce, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
478 const float lambda) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
479 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
480 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
|
481 int i, j; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
482 int idx; |
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
483 TrellisPath paths[TRELLIS_STAGES][TRELLIS_STATES]; |
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
484 int bandaddr[TRELLIS_STAGES]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
485 int minq; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
486 float mincost; |
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
487 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
|
488 int q0, q1, qcnt = 0; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
489 |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
490 for (i = 0; i < 1024; i++) { |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
491 float t = fabsf(sce->coeffs[i]); |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
492 if (t > 0.0f) { |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
493 q0f = FFMIN(q0f, t); |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
494 q1f = FFMAX(q1f, t); |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
495 qnrgf += t*t; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
496 qcnt++; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
497 } |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
498 } |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
499 |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
500 if (!qcnt) { |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
501 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
|
502 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
|
503 return; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
504 } |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
505 |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
506 //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
|
507 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
|
508 //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
|
509 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
|
510 //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
|
511 if (q1 - q0 > 60) { |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
512 int q0low = q0; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
513 int q1high = q1; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
514 //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
|
515 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
|
516 q1 = qnrg + 30; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
517 q0 = qnrg - 30; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
518 //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
|
519 if (q0 < q0low) { |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
520 q1 += q0low - q0; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
521 q0 = q0low; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
522 } else if (q1 > q1high) { |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
523 q0 -= q1 - q1high; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
524 q1 = q1high; |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
525 } |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
526 } |
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
527 //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
|
528 |
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
529 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
|
530 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
|
531 paths[0][i].prev = -1; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
532 } |
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
533 for (j = 1; j < TRELLIS_STAGES; j++) { |
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
534 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
|
535 paths[j][i].cost = INFINITY; |
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
536 paths[j][i].prev = -2; |
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
537 } |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
538 } |
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
539 idx = 1; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
540 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
9936 | 541 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
|
542 start = w*128; |
9936 | 543 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
|
544 const float *coefs = sce->coeffs + start; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
545 float qmin, qmax; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
546 int nz = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
547 |
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
548 bandaddr[idx] = w * 16 + g; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
549 qmin = INT_MAX; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
550 qmax = 0.0f; |
9936 | 551 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
|
552 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
9936 | 553 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
|
554 sce->zeroes[(w+w2)*16+g] = 1; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
555 continue; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
556 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
557 sce->zeroes[(w+w2)*16+g] = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
558 nz = 1; |
9936 | 559 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
|
560 float t = fabsf(coefs[w2*128+i]); |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
561 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
|
562 qmin = FFMIN(qmin, t); |
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
563 qmax = FFMAX(qmax, t); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
564 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
565 } |
9936 | 566 if (nz) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
567 int minscale, maxscale; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
568 float minrd = INFINITY; |
11769 | 569 float maxval; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
570 //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
|
571 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
|
572 //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
|
573 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
|
574 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
|
575 maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES); |
11769 | 576 maxval = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], s->scoefs+start); |
9936 | 577 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
|
578 float dist = 0; |
11764
e9c024d542f4
aacenc: Split find_max_val() from find_min_book() to eliminate duplicate searches.
alexc
parents:
11763
diff
changeset
|
579 int cb = find_min_book(maxval, sce->sf_idx[w*16+g]); |
9936 | 580 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
|
581 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
|
582 dist += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g], |
11793 | 583 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
|
584 } |
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
585 minrd = FFMIN(minrd, dist); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
586 |
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
587 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
|
588 float cost; |
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
589 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
|
590 + 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
|
591 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
|
592 paths[idx][q].cost = cost; |
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
593 paths[idx][q].prev = i; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
594 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
595 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
596 } |
9936 | 597 } else { |
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
598 for (q = 0; q < q1 - q0; q++) { |
11793 | 599 paths[idx][q].cost = paths[idx - 1][q].cost + 1; |
600 paths[idx][q].prev = q; | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
601 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
602 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
603 sce->zeroes[w*16+g] = !nz; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
604 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
|
605 idx++; |
9935
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 } |
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
608 idx--; |
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
609 mincost = paths[idx][0].cost; |
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
610 minq = 0; |
10213
cebf6e3381e0
aacenc: Use preprocessor constants for trellis states and stages.
alexc
parents:
10212
diff
changeset
|
611 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
|
612 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
|
613 mincost = paths[idx][i].cost; |
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
614 minq = i; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
615 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
616 } |
10212
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
617 while (idx) { |
11761
418455c7e31f
aacenc: Only trellis over a column of 61 scalefactors (reduced from 256).
alexc
parents:
11760
diff
changeset
|
618 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
|
619 minq = paths[idx][minq].prev; |
4e2db0d76fad
aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
alexc
parents:
10211
diff
changeset
|
620 idx--; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
621 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
622 //set the same quantizers inside window groups |
9936 | 623 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
624 for (g = 0; g < sce->ics.num_swb; g++) | |
625 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
|
626 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
|
627 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
628 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
629 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
630 * 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
|
631 */ |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
632 static void search_for_quantizers_twoloop(AVCodecContext *avctx, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
633 AACEncContext *s, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
634 SingleChannelElement *sce, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
635 const float lambda) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
636 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
637 int start = 0, i, w, w2, g; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
638 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
|
639 float dists[128], uplims[128]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
640 int fflag, minscaler; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
641 int its = 0; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
642 int allz = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
643 float minthr = INFINITY; |
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 //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
|
646 memset(dists, 0, sizeof(dists)); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
647 //determine zero bands and upper limits |
9936 | 648 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
649 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
|
650 int nz = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
651 float uplim = 0.0f; |
9936 | 652 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
|
653 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
|
654 uplim += band->threshold; |
9936 | 655 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
|
656 sce->zeroes[(w+w2)*16+g] = 1; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
657 continue; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
658 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
659 nz = 1; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
660 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
661 uplims[w*16+g] = uplim *512; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
662 sce->zeroes[w*16+g] = !nz; |
9936 | 663 if (nz) |
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
664 minthr = FFMIN(minthr, uplim); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
665 allz = FFMAX(allz, nz); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
666 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
667 } |
9936 | 668 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
669 for (g = 0; g < sce->ics.num_swb; g++) { | |
670 if (sce->zeroes[w*16+g]) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
671 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
|
672 continue; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
673 } |
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9939
diff
changeset
|
674 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
|
675 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
676 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
677 |
9936 | 678 if (!allz) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
679 return; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
680 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
|
681 //perform two-loop search |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
682 //outer loop - improve quality |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
683 do { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
684 int tbits, qstep; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
685 minscaler = sce->sf_idx[0]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
686 //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
|
687 qstep = its ? 1 : 32; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
688 do { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
689 int prev = -1; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
690 tbits = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
691 fflag = 0; |
9936 | 692 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
|
693 start = w*128; |
9936 | 694 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
|
695 const float *coefs = sce->coeffs + start; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
696 const float *scaled = s->scoefs + start; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
697 int bits = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
698 int cb; |
11792
a211c41465f3
aacenc: Remove unnecessary variables and scopes in the TLS.
alexc
parents:
11769
diff
changeset
|
699 float dist = 0.0f; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
700 |
9971
4b6f16da6652
Be sure to increment our position in the coefficient array when skipping a zero
alexc
parents:
9967
diff
changeset
|
701 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
|
702 start += sce->ics.swb_sizes[g]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
703 continue; |
9971
4b6f16da6652
Be sure to increment our position in the coefficient array when skipping a zero
alexc
parents:
9967
diff
changeset
|
704 } |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
705 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); |
11793 | 706 cb = find_min_book(find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled), sce->sf_idx[w*16+g]); |
707 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { | |
708 int b; | |
709 dist += quantize_band_cost(s, coefs + w2*128, | |
710 scaled + w2*128, | |
711 sce->ics.swb_sizes[g], | |
712 sce->sf_idx[w*16+g], | |
713 cb, | |
11794
233b2faac076
aacenc: Remove an unnecessary division from the TLS.
alexc
parents:
11793
diff
changeset
|
714 1.0f, |
11793 | 715 INFINITY, |
716 &b); | |
717 bits += b; | |
718 } | |
11794
233b2faac076
aacenc: Remove an unnecessary division from the TLS.
alexc
parents:
11793
diff
changeset
|
719 dists[w*16+g] = dist - bits; |
9936 | 720 if (prev != -1) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
721 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
|
722 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
723 tbits += bits; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
724 start += sce->ics.swb_sizes[g]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
725 prev = sce->sf_idx[w*16+g]; |
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 (tbits > destbits) { |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
729 for (i = 0; i < 128; i++) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
730 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
|
731 sce->sf_idx[i] += qstep; |
9936 | 732 } else { |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
733 for (i = 0; i < 128; i++) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
734 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
|
735 sce->sf_idx[i] -= qstep; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
736 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
737 qstep >>= 1; |
9936 | 738 if (!qstep && tbits > destbits*1.02) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
739 qstep = 1; |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
740 if (sce->sf_idx[0] >= 217) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
741 break; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
742 } while (qstep); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
743 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
744 fflag = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
745 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); |
9936 | 746 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
|
747 start = w*128; |
9936 | 748 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
|
749 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
|
750 const float *scaled = s->scoefs + start; |
9936 | 751 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
|
752 sce->sf_idx[w*16+g]--; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
753 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
|
754 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219); |
9936 | 755 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
|
756 fflag = 1; |
11997
081702713f47
aacenc: Fill in the estimated codebook for the final computed scalefactor in the TLS.
alexc
parents:
11794
diff
changeset
|
757 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
|
758 start += sce->ics.swb_sizes[g]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
759 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
760 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
761 its++; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
762 } while (fflag && its < 10); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
763 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
764 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
765 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
|
766 SingleChannelElement *sce, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
767 const float lambda) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
768 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
769 int start = 0, i, w, w2, g; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
770 float uplim[128], maxq[128]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
771 int minq, maxsf; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
772 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
|
773 int last = 0, lastband = 0, curband = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
774 float avg_energy = 0.0; |
9936 | 775 if (sce->ics.num_windows == 1) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
776 start = 0; |
9936 | 777 for (i = 0; i < 1024; i++) { |
778 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
|
779 start += sce->ics.swb_sizes[curband]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
780 curband++; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
781 } |
9936 | 782 if (sce->coeffs[i]) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
783 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
|
784 last = i; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
785 lastband = curband; |
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 } |
9936 | 788 } else { |
789 for (w = 0; w < 8; w++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
790 const float *coeffs = sce->coeffs + w*128; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
791 start = 0; |
9936 | 792 for (i = 0; i < 128; i++) { |
793 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
|
794 start += sce->ics.swb_sizes[curband]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
795 curband++; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
796 } |
9936 | 797 if (coeffs[i]) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
798 avg_energy += coeffs[i] * coeffs[i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
799 last = FFMAX(last, i); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
800 lastband = FFMAX(lastband, curband); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
801 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
802 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
803 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
804 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
805 last++; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
806 avg_energy /= last; |
9936 | 807 if (avg_energy == 0.0f) { |
808 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
|
809 sce->sf_idx[i] = SCALE_ONE_POS; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
810 return; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
811 } |
9936 | 812 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
|
813 start = w*128; |
9936 | 814 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
|
815 float *coefs = sce->coeffs + start; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
816 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
|
817 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
|
818 float maxval = -1, thr = 0.0f, t; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
819 maxq[w*16+g] = 0.0f; |
9936 | 820 if (g > lastband) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
821 maxq[w*16+g] = 0.0f; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
822 start += size; |
9936 | 823 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
|
824 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
|
825 continue; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
826 } |
9936 | 827 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
828 for (i = 0; i < size; i++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
829 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
|
830 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
|
831 thr += t; |
9936 | 832 if (sce->ics.num_windows == 1 && maxval < t) { |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
833 maxval = t; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
834 peakpos = start+i; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
835 } |
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 if (sce->ics.num_windows == 1) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
839 start2 = FFMAX(peakpos - 2, start2); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
840 end2 = FFMIN(peakpos + 3, end2); |
9936 | 841 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
842 start2 -= start; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
843 end2 -= start; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
844 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
845 start += size; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
846 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
|
847 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
|
848 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
|
849 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
850 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
851 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
|
852 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
9936 | 853 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
|
854 start = w*128; |
9936 | 855 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
|
856 const float *coefs = sce->coeffs + start; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
857 const float *scaled = s->scoefs + start; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
858 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
|
859 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
|
860 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
|
861 float curdiff; |
9936 | 862 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
|
863 sce->zeroes[w*16+g] = 1; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
864 start += size; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
865 continue; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
866 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
867 sce->zeroes[w*16+g] = 0; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
868 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
|
869 step = 16; |
9936 | 870 for (;;) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
871 float dist = 0.0f; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
872 int quant_max; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
873 |
9936 | 874 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
|
875 int b; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
876 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
|
877 scaled + w2*128, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
878 sce->ics.swb_sizes[g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
879 scf, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
880 ESC_BT, |
9939 | 881 lambda, |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
882 INFINITY, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
883 &b); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
884 dist -= b; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
885 } |
9939 | 886 dist *= 1.0f / 512.0f / lambda; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
887 quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[200 - scf + SCALE_ONE_POS - SCALE_DIV_512]); |
9936 | 888 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
|
889 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
|
890 break; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
891 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
892 prev_scf = scf; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
893 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
|
894 if (curdiff <= 1.0f) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
895 step = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
896 else |
11686
41a083a2527a
Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents:
11644
diff
changeset
|
897 step = log2(curdiff); |
9936 | 898 if (dist > uplim[w*16+g]) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
899 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
|
900 scf += step; |
11688 | 901 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
|
902 step = scf - prev_scf; |
9936 | 903 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
|
904 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
|
905 break; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
906 } |
9936 | 907 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
|
908 min_scf = prev_scf; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
909 else |
11686
41a083a2527a
Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
alexc
parents:
11644
diff
changeset
|
910 max_scf = prev_scf; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
911 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
912 start += size; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
913 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
914 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
915 minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX; |
9936 | 916 for (i = 1; i < 128; i++) { |
917 if (!sce->sf_idx[i]) | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
918 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
|
919 else |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
920 minq = FFMIN(minq, sce->sf_idx[i]); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
921 } |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
922 if (minq == INT_MAX) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
923 minq = 0; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
924 minq = FFMIN(minq, SCALE_MAX_POS); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
925 maxsf = FFMIN(minq + SCALE_MAX_DIFF, SCALE_MAX_POS); |
9936 | 926 for (i = 126; i >= 0; i--) { |
927 if (!sce->sf_idx[i]) | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
928 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
|
929 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
|
930 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
931 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
932 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
933 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
|
934 SingleChannelElement *sce, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
935 const float lambda) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
936 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
937 int start = 0, i, w, w2, g; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
938 int minq = 255; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
939 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
940 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); |
9936 | 941 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
|
942 start = w*128; |
9936 | 943 for (g = 0; g < sce->ics.num_swb; g++) { |
944 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
945 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
9936 | 946 if (band->energy <= band->threshold) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
947 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
|
948 sce->zeroes[(w+w2)*16+g] = 1; |
9936 | 949 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
950 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
|
951 sce->zeroes[(w+w2)*16+g] = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
952 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
953 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
|
954 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
955 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
956 } |
9936 | 957 for (i = 0; i < 128; i++) { |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
958 sce->sf_idx[i] = 140; |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
959 //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
|
960 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
961 //set the same quantizers inside window groups |
9936 | 962 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
963 for (g = 0; g < sce->ics.num_swb; g++) | |
964 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
|
965 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
|
966 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
967 |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
968 static void search_for_ms(AACEncContext *s, ChannelElement *cpe, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
969 const float lambda) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
970 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
971 int start = 0, i, w, w2, g; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
972 float M[128], S[128]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
973 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
|
974 SingleChannelElement *sce0 = &cpe->ch[0]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
975 SingleChannelElement *sce1 = &cpe->ch[1]; |
9936 | 976 if (!cpe->common_window) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
977 return; |
9936 | 978 for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) { |
979 for (g = 0; g < sce0->ics.num_swb; g++) { | |
980 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
|
981 float dist1 = 0.0f, dist2 = 0.0f; |
9936 | 982 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
|
983 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
|
984 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
|
985 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
|
986 float maxthr = FFMAX(band0->threshold, band1->threshold); |
9936 | 987 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
|
988 M[i] = (sce0->coeffs[start+w2*128+i] |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
989 + 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
|
990 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
|
991 - sce1->coeffs[start+w2*128+i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
992 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
993 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
|
994 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
|
995 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
|
996 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
|
997 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
|
998 L34, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
999 sce0->ics.swb_sizes[g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1000 sce0->sf_idx[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1001 sce0->band_type[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1002 lambda / band0->threshold, INFINITY, NULL); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1003 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
|
1004 R34, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1005 sce1->ics.swb_sizes[g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1006 sce1->sf_idx[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1007 sce1->band_type[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1008 lambda / band1->threshold, INFINITY, NULL); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1009 dist2 += quantize_band_cost(s, M, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1010 M34, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1011 sce0->ics.swb_sizes[g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1012 sce0->sf_idx[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1013 sce0->band_type[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1014 lambda / maxthr, INFINITY, NULL); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1015 dist2 += quantize_band_cost(s, S, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1016 S34, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1017 sce1->ics.swb_sizes[g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1018 sce1->sf_idx[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1019 sce1->band_type[(w+w2)*16+g], |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1020 lambda / minthr, INFINITY, NULL); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1021 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1022 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
|
1023 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1024 start += sce0->ics.swb_sizes[g]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1025 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1026 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1027 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1028 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1029 AACCoefficientsEncoder ff_aac_coders[] = { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1030 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1031 search_for_quantizers_faac, |
9939 | 1032 encode_window_bands_info, |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1033 quantize_and_encode_band, |
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1034 search_for_ms, |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1035 }, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1036 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1037 search_for_quantizers_anmr, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1038 encode_window_bands_info, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1039 quantize_and_encode_band, |
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1040 search_for_ms, |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1041 }, |
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 search_for_quantizers_twoloop, |
11732
c40cc26cd23f
aacenc: Add a rate only trellis for codebook selection for the TLS.
alexc
parents:
11731
diff
changeset
|
1044 codebook_trellis_rate, |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1045 quantize_and_encode_band, |
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1046 search_for_ms, |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1047 }, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1048 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1049 search_for_quantizers_fast, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1050 encode_window_bands_info, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1051 quantize_and_encode_band, |
10109
68f824761c1b
Re-add search_for_ms to the coefficients encoders to silence warnings
alexc
parents:
9971
diff
changeset
|
1052 search_for_ms, |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1053 }, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
diff
changeset
|
1054 }; |