51 #define BITSTREAM_WRITER_LE
54 #define POW_TABLE_SIZE (1<<11)
55 #define POW_TABLE_OFFSET 3
56 #define OPT_SIZE ((1<<15) + 3000)
74 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
75 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14,
76 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26,
77 27, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40,
78 41, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53,
79 54, 55, 55, 56, 57, 57, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62,
83 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
84 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12,
85 13, 13, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23,
86 23, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28,
87 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30,
97 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11,
100 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8,
101 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
102 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 29,
105 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3,
106 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9,
107 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15,
108 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20,
109 21, 21, 22, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32,
110 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 44, 45, 45,
111 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52,
112 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57,
113 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61,
117 static const float quant_lut_mul[7] = { 0.0, 0.0, 2.0, 2.0, 5.0, 12.0, 36.6 };
118 static const float quant_lut_add[7] = { 0.0, 0.0, 2.0, 7.0, 21.0, 56.0, 157.0 };
129 s->mdct_ctx.mdct_calc(&
s->mdct_ctx,
s->mdct_out,
s->in_buff);
157 for (
int i = 1;
i < 513;
i++) {
183 av_log(avctx,
AV_LOG_ERROR,
"Nellymoser works only with 8000, 16000, 11025, 22050 and 44100 sample rate\n");
197 if (
s->avctx->trellis) {
200 if (!
s->opt || !
s->path)
209 #define find_best(val, table, LUT, LUT_add, LUT_size) \
211 LUT[av_clip ((lrintf(val) >> 8) + LUT_add, 0, LUT_size - 1)]; \
212 if (fabs(val - table[best_idx]) > fabs(val - table[best_idx + 1])) \
217 int band, best_idx, power_idx = 0;
218 float power_candidate;
222 idx_table[0] = best_idx;
226 power_candidate = cand[band] - power_idx;
228 idx_table[band] = best_idx;
233 static inline float distance(
float x,
float y,
int band)
242 int i, j, band, best_idx;
243 float power_candidate, best_val;
252 for (
i = 0;
i < 64;
i++) {
260 int idx_min, idx_max, idx;
261 power_candidate = cand[band];
262 for (q = 1000; !
c && q <
OPT_SIZE; q <<= 2) {
263 idx_min =
FFMAX(0, cand[band] - q);
266 if (
isinf(opt[band - 1][
i]) )
268 for (j = 0; j < 32; j++) {
272 if (idx >= idx_min) {
273 tmp = opt[band - 1][
i] +
distance(idx, power_candidate, band);
274 if (opt[band][idx] >
tmp) {
275 opt[band][idx] =
tmp;
290 if (best_val > opt[band][
i]) {
291 best_val = opt[band][
i];
296 idx_table[band] = path[band][best_idx];
312 int i, j, band,
block, best_idx, power_idx = 0;
313 float power_val,
coeff, coeff_sum;
326 coeff_sum +=
s->mdct_out[
i ] *
s->mdct_out[
i ]
333 if (
s->avctx->trellis) {
350 s->mdct_out[
i] *= power_val;
395 frame->nb_samples *
sizeof(*
s->buf));
422 .
name =
"nellymoser",