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