52 #define BITSTREAM_WRITER_LE
55 #define POW_TABLE_SIZE (1<<11)
56 #define POW_TABLE_OFFSET 3
57 #define OPT_SIZE ((1<<15) + 3000)
76 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
77 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14,
78 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26,
79 27, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40,
80 41, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53,
81 54, 55, 55, 56, 57, 57, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62,
85 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
86 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12,
87 13, 13, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23,
88 23, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28,
89 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30,
99 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11,
102 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8,
103 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
104 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 29,
107 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3,
108 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9,
109 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15,
110 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20,
111 21, 21, 22, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32,
112 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 44, 45, 45,
113 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52,
114 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57,
115 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61,
119 static const float quant_lut_mul[7] = { 0.0, 0.0, 2.0, 2.0, 5.0, 12.0, 36.6 };
120 static const float quant_lut_add[7] = { 0.0, 0.0, 2.0, 7.0, 21.0, 56.0, 157.0 };
131 s->mdct_fn(
s->mdct_ctx,
s->mdct_out,
s->in_buff,
sizeof(
float));
159 for (
int i = 1;
i < 513;
i++) {
174 float scale = 32768.0;
181 av_log(avctx,
AV_LOG_ERROR,
"Nellymoser works only with 8000, 16000, 11025, 22050 and 44100 sample rate\n");
195 if (
s->avctx->trellis) {
198 if (!
s->opt || !
s->path)
207 #define find_best(val, table, LUT, LUT_add, LUT_size) \
209 LUT[av_clip ((lrintf(val) >> 8) + LUT_add, 0, LUT_size - 1)]; \
210 if (fabs(val - table[best_idx]) > fabs(val - table[best_idx + 1])) \
215 int band, best_idx, power_idx = 0;
216 float power_candidate;
220 idx_table[0] = best_idx;
224 power_candidate = cand[band] - power_idx;
226 idx_table[band] = best_idx;
231 static inline float distance(
float x,
float y,
int band)
240 int i, j, band, best_idx;
241 float power_candidate, best_val;
250 for (
i = 0;
i < 64;
i++) {
258 int idx_min, idx_max, idx;
259 power_candidate = cand[band];
260 for (q = 1000; !
c && q <
OPT_SIZE; q <<= 2) {
261 idx_min =
FFMAX(0, cand[band] - q);
264 if (
isinf(opt[band - 1][
i]) )
266 for (j = 0; j < 32; j++) {
270 if (idx >= idx_min) {
271 tmp = opt[band - 1][
i] +
distance(idx, power_candidate, band);
272 if (opt[band][idx] >
tmp) {
273 opt[band][idx] =
tmp;
288 if (best_val > opt[band][
i]) {
289 best_val = opt[band][
i];
294 idx_table[band] = path[band][best_idx];
310 int i, j, band,
block, best_idx, power_idx = 0;
311 float power_val,
coeff, coeff_sum;
324 coeff_sum +=
s->mdct_out[
i ] *
s->mdct_out[
i ]
331 if (
s->avctx->trellis) {
348 s->mdct_out[
i] *= power_val;
393 frame->nb_samples *
sizeof(*
s->buf));
420 .
p.
name =
"nellymoser",