FFmpeg
Loading...
Searching...
No Matches
wavpackenc.c
Go to the documentation of this file.
1/*
2 * WavPack lossless audio encoder
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
22#define BITSTREAM_WRITER_LE
23
26#include "libavutil/mem.h"
27#include "libavutil/opt.h"
28#include "avcodec.h"
29#include "codec_internal.h"
30#include "encode.h"
31#include "put_bits.h"
32#include "bytestream.h"
33#include "wavpackenc.h"
34#include "wavpack.h"
35
36#define UPDATE_WEIGHT(weight, delta, source, result) \
37 if ((source) && (result)) { \
38 int32_t s = (int32_t) ((source) ^ (result)) >> 31; \
39 weight = ((delta) ^ s) + ((weight) - s); \
40 }
41
42#define APPLY_WEIGHT_F(weight, sample) ((((((sample) & 0xffff) * (weight)) >> 9) + \
43 ((((sample) & ~0xffff) >> 9) * (weight)) + 1) >> 1)
44
45#define APPLY_WEIGHT_I(weight, sample) (((weight) * (sample) + 512) >> 10)
46
47#define APPLY_WEIGHT(weight, sample) ((sample) != (short) (sample) ? \
48 APPLY_WEIGHT_F(weight, sample) : APPLY_WEIGHT_I (weight, sample))
49
50#define CLEAR(destin) memset(&destin, 0, sizeof(destin));
51
52#define SHIFT_LSB 13
53#define SHIFT_MASK (0x1FU << SHIFT_LSB)
54
55#define MAG_LSB 18
56#define MAG_MASK (0x1FU << MAG_LSB)
57
58#define SRATE_LSB 23
59#define SRATE_MASK (0xFU << SRATE_LSB)
60
61#define EXTRA_TRY_DELTAS 1
62#define EXTRA_ADJUST_DELTAS 2
63#define EXTRA_SORT_FIRST 4
64#define EXTRA_BRANCHES 8
65#define EXTRA_SORT_LAST 16
66
72
78
128
130{
132
133 s->avctx = avctx;
134
135 if (avctx->ch_layout.nb_channels > 255) {
136 av_log(avctx, AV_LOG_ERROR, "Invalid channel count: %d\n", avctx->ch_layout.nb_channels);
137 return AVERROR(EINVAL);
138 }
139
140 if (!avctx->frame_size) {
141 int block_samples;
142 if (!(avctx->sample_rate & 1))
143 block_samples = avctx->sample_rate / 2;
144 else
145 block_samples = avctx->sample_rate;
146
147 while (block_samples * avctx->ch_layout.nb_channels > WV_MAX_SAMPLES)
148 block_samples /= 2;
149
150 while (block_samples * avctx->ch_layout.nb_channels < 40000)
151 block_samples *= 2;
152 avctx->frame_size = block_samples;
153 } else if (avctx->frame_size && (avctx->frame_size < 128 ||
154 avctx->frame_size > WV_MAX_SAMPLES)) {
155 av_log(avctx, AV_LOG_ERROR, "invalid block size: %d\n", avctx->frame_size);
156 return AVERROR(EINVAL);
157 }
158
160 if (avctx->compression_level >= 3) {
161 s->decorr_filter = 3;
162 s->num_passes = 9;
163 if (avctx->compression_level >= 8) {
164 s->num_branches = 4;
166 } else if (avctx->compression_level >= 7) {
167 s->num_branches = 3;
169 } else if (avctx->compression_level >= 6) {
170 s->num_branches = 2;
172 } else if (avctx->compression_level >= 5) {
173 s->num_branches = 1;
175 } else if (avctx->compression_level >= 4) {
176 s->num_branches = 1;
178 }
179 } else if (avctx->compression_level == 2) {
180 s->decorr_filter = 2;
181 s->num_passes = 4;
182 } else if (avctx->compression_level == 1) {
183 s->decorr_filter = 1;
184 s->num_passes = 2;
185 } else if (avctx->compression_level < 1) {
186 s->decorr_filter = 0;
187 s->num_passes = 0;
188 }
189 }
190
191 s->num_decorrs = decorr_filter_sizes[s->decorr_filter];
192 s->decorr_specs = decorr_filters[s->decorr_filter];
193
194 s->delta_decay = 2.0;
195
196 return 0;
197}
198
199static void shift_mono(int32_t *samples, int nb_samples, int shift)
200{
201 int i;
202 for (i = 0; i < nb_samples; i++)
203 samples[i] >>= shift;
204}
205
206static void shift_stereo(int32_t *left, int32_t *right,
207 int nb_samples, int shift)
208{
209 int i;
210 for (i = 0; i < nb_samples; i++) {
211 left [i] >>= shift;
212 right[i] >>= shift;
213 }
214}
215
216#define FLOAT_SHIFT_ONES 1
217#define FLOAT_SHIFT_SAME 2
218#define FLOAT_SHIFT_SENT 4
219#define FLOAT_ZEROS_SENT 8
220#define FLOAT_NEG_ZEROS 0x10
221#define FLOAT_EXCEPTIONS 0x20
222
223#define get_mantissa(f) ((f) & 0x7fffff)
224#define get_exponent(f) (((f) >> 23) & 0xff)
225#define get_sign(f) (((f) >> 31) & 0x1)
226
228{
229 int32_t shift_count, value, f = *sample;
230
231 if (get_exponent(f) == 255) {
232 s->float_flags |= FLOAT_EXCEPTIONS;
233 value = 0x1000000;
234 shift_count = 0;
235 } else if (get_exponent(f)) {
236 shift_count = s->max_exp - get_exponent(f);
237 value = 0x800000 + get_mantissa(f);
238 } else {
239 shift_count = s->max_exp ? s->max_exp - 1 : 0;
241 }
242
243 if (shift_count < 25)
244 value >>= shift_count;
245 else
246 value = 0;
247
248 if (!value) {
249 if (get_exponent(f) || get_mantissa(f))
250 s->false_zeros++;
251 else if (get_sign(f))
252 s->neg_zeros++;
253 } else if (shift_count) {
254 int32_t mask = (1 << shift_count) - 1;
255
256 if (!(get_mantissa(f) & mask))
257 s->shifted_zeros++;
258 else if ((get_mantissa(f) & mask) == mask)
259 s->shifted_ones++;
260 else
261 s->shifted_both++;
262 }
263
264 s->ordata |= value;
265 *sample = get_sign(f) ? -value : value;
266}
267
269 int32_t *samples_l, int32_t *samples_r,
270 int nb_samples)
271{
272 uint32_t crc = 0xffffffffu;
273 int i;
274
275 s->shifted_ones = s->shifted_zeros = s->shifted_both = s->ordata = 0;
276 s->float_shift = s->float_flags = 0;
277 s->false_zeros = s->neg_zeros = 0;
278 s->max_exp = 0;
279
280 if (s->flags & WV_MONO_DATA) {
281 for (i = 0; i < nb_samples; i++) {
282 int32_t f = samples_l[i];
283 crc = crc * 27 + get_mantissa(f) * 9 + get_exponent(f) * 3 + get_sign(f);
284
285 if (get_exponent(f) > s->max_exp && get_exponent(f) < 255)
286 s->max_exp = get_exponent(f);
287 }
288 } else {
289 for (i = 0; i < nb_samples; i++) {
290 int32_t f;
291
292 f = samples_l[i];
293 crc = crc * 27 + get_mantissa(f) * 9 + get_exponent(f) * 3 + get_sign(f);
294 if (get_exponent(f) > s->max_exp && get_exponent(f) < 255)
295 s->max_exp = get_exponent(f);
296
297 f = samples_r[i];
298 crc = crc * 27 + get_mantissa(f) * 9 + get_exponent(f) * 3 + get_sign(f);
299
300 if (get_exponent(f) > s->max_exp && get_exponent(f) < 255)
301 s->max_exp = get_exponent(f);
302 }
303 }
304
305 s->crc_x = crc;
306
307 if (s->flags & WV_MONO_DATA) {
308 for (i = 0; i < nb_samples; i++)
309 process_float(s, &samples_l[i]);
310 } else {
311 for (i = 0; i < nb_samples; i++) {
312 process_float(s, &samples_l[i]);
313 process_float(s, &samples_r[i]);
314 }
315 }
316
317 s->float_max_exp = s->max_exp;
318
319 if (s->shifted_both)
320 s->float_flags |= FLOAT_SHIFT_SENT;
321 else if (s->shifted_ones && !s->shifted_zeros)
322 s->float_flags |= FLOAT_SHIFT_ONES;
323 else if (s->shifted_ones && s->shifted_zeros)
324 s->float_flags |= FLOAT_SHIFT_SAME;
325 else if (s->ordata && !(s->ordata & 1)) {
326 do {
327 s->float_shift++;
328 s->ordata >>= 1;
329 } while (!(s->ordata & 1));
330
331 if (s->flags & WV_MONO_DATA)
332 shift_mono(samples_l, nb_samples, s->float_shift);
333 else
334 shift_stereo(samples_l, samples_r, nb_samples, s->float_shift);
335 }
336
337 s->flags &= ~MAG_MASK;
338
339 while (s->ordata) {
340 s->flags += 1 << MAG_LSB;
341 s->ordata >>= 1;
342 }
343
344 if (s->false_zeros || s->neg_zeros)
345 s->float_flags |= FLOAT_ZEROS_SENT;
346
347 if (s->neg_zeros)
348 s->float_flags |= FLOAT_NEG_ZEROS;
349
350 return s->float_flags & (FLOAT_EXCEPTIONS | FLOAT_ZEROS_SENT |
352}
353
355 int32_t *samples_l, int32_t *samples_r,
356 int nb_samples)
357{
358 uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0;
359 int i, total_shift = 0;
360
361 s->int32_sent_bits = s->int32_zeros = s->int32_ones = s->int32_dups = 0;
362
363 if (s->flags & WV_MONO_DATA) {
364 for (i = 0; i < nb_samples; i++) {
365 int32_t M = samples_l[i];
366
367 magdata |= (M < 0) ? ~M : M;
368 xordata |= M ^ -(M & 1);
369 anddata &= M;
370 ordata |= M;
371
372 if ((ordata & 1) && !(anddata & 1) && (xordata & 2))
373 return;
374 }
375 } else {
376 for (i = 0; i < nb_samples; i++) {
377 int32_t L = samples_l[i];
378 int32_t R = samples_r[i];
379
380 magdata |= (L < 0) ? ~L : L;
381 magdata |= (R < 0) ? ~R : R;
382 xordata |= L ^ -(L & 1);
383 xordata |= R ^ -(R & 1);
384 anddata &= L & R;
385 ordata |= L | R;
386
387 if ((ordata & 1) && !(anddata & 1) && (xordata & 2))
388 return;
389 }
390 }
391
392 s->flags &= ~MAG_MASK;
393
394 while (magdata) {
395 s->flags += 1 << MAG_LSB;
396 magdata >>= 1;
397 }
398
399 if (!(s->flags & MAG_MASK))
400 return;
401
402 if (!(ordata & 1)) {
403 do {
404 s->flags -= 1 << MAG_LSB;
405 s->int32_zeros++;
406 total_shift++;
407 ordata >>= 1;
408 } while (!(ordata & 1));
409 } else if (anddata & 1) {
410 do {
411 s->flags -= 1 << MAG_LSB;
412 s->int32_ones++;
413 total_shift++;
414 anddata >>= 1;
415 } while (anddata & 1);
416 } else if (!(xordata & 2)) {
417 do {
418 s->flags -= 1 << MAG_LSB;
419 s->int32_dups++;
420 total_shift++;
421 xordata >>= 1;
422 } while (!(xordata & 2));
423 }
424
425 if (total_shift) {
426 s->flags |= WV_INT32_DATA;
427
428 if (s->flags & WV_MONO_DATA)
429 shift_mono(samples_l, nb_samples, total_shift);
430 else
431 shift_stereo(samples_l, samples_r, nb_samples, total_shift);
432 }
433}
434
436 int32_t *samples_l, int32_t *samples_r,
437 int nb_samples)
438{
439 uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0;
440 uint32_t crc = 0xffffffffu;
441 int i, total_shift = 0;
442
443 s->int32_sent_bits = s->int32_zeros = s->int32_ones = s->int32_dups = 0;
444
445 if (s->flags & WV_MONO_DATA) {
446 for (i = 0; i < nb_samples; i++) {
447 int32_t M = samples_l[i];
448
449 crc = crc * 9 + (M & 0xffff) * 3 + ((M >> 16) & 0xffff);
450 magdata |= (M < 0) ? ~M : M;
451 xordata |= M ^ -(M & 1);
452 anddata &= M;
453 ordata |= M;
454 }
455 } else {
456 for (i = 0; i < nb_samples; i++) {
457 int32_t L = samples_l[i];
458 int32_t R = samples_r[i];
459
460 crc = crc * 9 + (L & 0xffff) * 3 + ((L >> 16) & 0xffff);
461 crc = crc * 9 + (R & 0xffff) * 3 + ((R >> 16) & 0xffff);
462 magdata |= (L < 0) ? ~L : L;
463 magdata |= (R < 0) ? ~R : R;
464 xordata |= L ^ -(L & 1);
465 xordata |= R ^ -(R & 1);
466 anddata &= L & R;
467 ordata |= L | R;
468 }
469 }
470
471 s->crc_x = crc;
472 s->flags &= ~MAG_MASK;
473
474 while (magdata) {
475 s->flags += 1 << MAG_LSB;
476 magdata >>= 1;
477 }
478
479 if (!((s->flags & MAG_MASK) >> MAG_LSB)) {
480 s->flags &= ~WV_INT32_DATA;
481 return 0;
482 }
483
484 if (!(ordata & 1))
485 do {
486 s->flags -= 1 << MAG_LSB;
487 s->int32_zeros++;
488 total_shift++;
489 ordata >>= 1;
490 } while (!(ordata & 1));
491 else if (anddata & 1)
492 do {
493 s->flags -= 1 << MAG_LSB;
494 s->int32_ones++;
495 total_shift++;
496 anddata >>= 1;
497 } while (anddata & 1);
498 else if (!(xordata & 2))
499 do {
500 s->flags -= 1 << MAG_LSB;
501 s->int32_dups++;
502 total_shift++;
503 xordata >>= 1;
504 } while (!(xordata & 2));
505
506 if (((s->flags & MAG_MASK) >> MAG_LSB) > 23) {
507 s->int32_sent_bits = (uint8_t)(((s->flags & MAG_MASK) >> MAG_LSB) - 23);
508 total_shift += s->int32_sent_bits;
509 s->flags &= ~MAG_MASK;
510 s->flags += 23 << MAG_LSB;
511 }
512
513 if (total_shift) {
514 s->flags |= WV_INT32_DATA;
515
516 if (s->flags & WV_MONO_DATA)
517 shift_mono(samples_l, nb_samples, total_shift);
518 else
519 shift_stereo(samples_l, samples_r, nb_samples, total_shift);
520 }
521
522 return s->int32_sent_bits;
523}
524
525static int8_t store_weight(int weight)
526{
527 weight = av_clip(weight, -1024, 1024);
528 if (weight > 0)
529 weight -= (weight + 64) >> 7;
530
531 return (weight + 4) >> 3;
532}
533
534static int restore_weight(int8_t weight)
535{
536 int result = 8 * weight;
537
538 if (result > 0)
539 result += (result + 64) >> 7;
540
541 return result;
542}
543
544static int log2s(int32_t value)
545{
546 return (value < 0) ? -wp_log2(-value) : wp_log2(value);
547}
548
549static void decorr_mono(int32_t *in_samples, int32_t *out_samples,
550 int nb_samples, struct Decorr *dpp, int dir)
551{
552 int m = 0, i;
553
554 dpp->sumA = 0;
555
556 if (dir < 0) {
557 out_samples += (nb_samples - 1);
558 in_samples += (nb_samples - 1);
559 }
560
562
563 for (i = 0; i < MAX_TERM; i++)
564 dpp->samplesA[i] = wp_exp2(log2s(dpp->samplesA[i]));
565
566 if (dpp->value > MAX_TERM) {
567 while (nb_samples--) {
568 int32_t left, sam_A;
569
570 sam_A = ((3 - (dpp->value & 1)) * dpp->samplesA[0] - dpp->samplesA[1]) >> !(dpp->value & 1);
571
572 dpp->samplesA[1] = dpp->samplesA[0];
573 dpp->samplesA[0] = left = in_samples[0];
574
575 left -= APPLY_WEIGHT(dpp->weightA, sam_A);
576 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam_A, left);
577 dpp->sumA += dpp->weightA;
578 out_samples[0] = left;
579 in_samples += dir;
580 out_samples += dir;
581 }
582 } else if (dpp->value > 0) {
583 while (nb_samples--) {
584 int k = (m + dpp->value) & (MAX_TERM - 1);
585 int32_t left, sam_A;
586
587 sam_A = dpp->samplesA[m];
588 dpp->samplesA[k] = left = in_samples[0];
589 m = (m + 1) & (MAX_TERM - 1);
590
591 left -= APPLY_WEIGHT(dpp->weightA, sam_A);
592 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam_A, left);
593 dpp->sumA += dpp->weightA;
594 out_samples[0] = left;
595 in_samples += dir;
596 out_samples += dir;
597 }
598 }
599
600 if (m && dpp->value > 0 && dpp->value <= MAX_TERM) {
601 int32_t temp_A[MAX_TERM];
602
603 memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
604
605 for (i = 0; i < MAX_TERM; i++) {
606 dpp->samplesA[i] = temp_A[m];
607 m = (m + 1) & (MAX_TERM - 1);
608 }
609 }
610}
611
612static void reverse_mono_decorr(struct Decorr *dpp)
613{
614 if (dpp->value > MAX_TERM) {
615 int32_t sam_A;
616
617 if (dpp->value & 1)
618 sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
619 else
620 sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
621
622 dpp->samplesA[1] = dpp->samplesA[0];
623 dpp->samplesA[0] = sam_A;
624
625 if (dpp->value & 1)
626 sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
627 else
628 sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
629
630 dpp->samplesA[1] = sam_A;
631 } else if (dpp->value > 1) {
632 int i, j, k;
633
634 for (i = 0, j = dpp->value - 1, k = 0; k < dpp->value / 2; i++, j--, k++) {
635 i &= (MAX_TERM - 1);
636 j &= (MAX_TERM - 1);
637 dpp->samplesA[i] ^= dpp->samplesA[j];
638 dpp->samplesA[j] ^= dpp->samplesA[i];
639 dpp->samplesA[i] ^= dpp->samplesA[j];
640 }
641 }
642}
643
644#define count_bits(av) ((av) ? 32 - ff_clz(av) : 0)
645
646static uint32_t log2sample(uint32_t v, int limit, uint32_t *result)
647{
648 uint32_t dbits = count_bits(v);
649
650 if ((v += v >> 9) < (1 << 8)) {
651 *result += (dbits << 8) + ff_wp_log2_table[(v << (9 - dbits)) & 0xff];
652 } else {
653 *result += dbits = (dbits << 8) + ff_wp_log2_table[(v >> (dbits - 9)) & 0xff];
654
655 if (limit && dbits >= limit)
656 return 1;
657 }
658
659 return 0;
660}
661
662static uint32_t log2mono(int32_t *samples, int nb_samples, int limit)
663{
664 uint32_t result = 0;
665 while (nb_samples--) {
666 if (log2sample(FFABSU(samples[0]), limit, &result))
667 return UINT32_MAX;
668 samples++;
669 }
670 return result;
671}
672
673static uint32_t log2stereo(int32_t *samples_l, int32_t *samples_r,
674 int nb_samples, int limit)
675{
676 uint32_t result = 0;
677 while (nb_samples--) {
678 if (log2sample(FFABSU(samples_l[0]), limit, &result) ||
679 log2sample(FFABSU(samples_r[0]), limit, &result))
680 return UINT32_MAX;
681 samples_l++;
682 samples_r++;
683 }
684 return result;
685}
686
687static void decorr_mono_buffer(int32_t *samples, int32_t *outsamples,
688 int nb_samples, struct Decorr *dpp,
689 int tindex)
690{
691 struct Decorr dp, *dppi = dpp + tindex;
692 int delta = dppi->delta, pre_delta, term = dppi->value;
693
694 if (delta == 7)
695 pre_delta = 7;
696 else if (delta < 2)
697 pre_delta = 3;
698 else
699 pre_delta = delta + 1;
700
701 CLEAR(dp);
702 dp.value = term;
703 dp.delta = pre_delta;
704 decorr_mono(samples, outsamples, FFMIN(2048, nb_samples), &dp, -1);
705 dp.delta = delta;
706
707 if (tindex == 0)
709 else
710 CLEAR(dp.samplesA);
711
712 memcpy(dppi->samplesA, dp.samplesA, sizeof(dp.samplesA));
713 dppi->weightA = dp.weightA;
714
715 if (delta == 0) {
716 dp.delta = 1;
717 decorr_mono(samples, outsamples, nb_samples, &dp, 1);
718 dp.delta = 0;
719 memcpy(dp.samplesA, dppi->samplesA, sizeof(dp.samplesA));
720 dppi->weightA = dp.weightA = dp.sumA / nb_samples;
721 }
722
723 decorr_mono(samples, outsamples, nb_samples, &dp, 1);
724}
725
727 int depth, int delta, uint32_t input_bits)
728{
729 int term, branches = s->num_branches - depth;
730 int32_t *samples, *outsamples;
731 uint32_t term_bits[22], bits;
732
733 if (branches < 1 || depth + 1 == info->nterms)
734 branches = 1;
735
736 CLEAR(term_bits);
737 samples = s->sampleptrs[depth][0];
738 outsamples = s->sampleptrs[depth + 1][0];
739
740 for (term = 1; term <= 18; term++) {
741 if (term == 17 && branches == 1 && depth + 1 < info->nterms)
742 continue;
743
744 if (term > 8 && term < 17)
745 continue;
746
747 if (!s->extra_flags && (term > 4 && term < 17))
748 continue;
749
750 info->dps[depth].value = term;
751 info->dps[depth].delta = delta;
752 decorr_mono_buffer(samples, outsamples, s->block_samples, info->dps, depth);
753 bits = log2mono(outsamples, s->block_samples, info->log_limit);
754
755 if (bits < info->best_bits) {
756 info->best_bits = bits;
757 CLEAR(s->decorr_passes);
758 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * (depth + 1));
759 memcpy(s->sampleptrs[info->nterms + 1][0],
760 s->sampleptrs[depth + 1][0], s->block_samples * 4);
761 }
762
763 term_bits[term + 3] = bits;
764 }
765
766 while (depth + 1 < info->nterms && branches--) {
767 uint32_t local_best_bits = input_bits;
768 int best_term = 0, i;
769
770 for (i = 0; i < 22; i++)
771 if (term_bits[i] && term_bits[i] < local_best_bits) {
772 local_best_bits = term_bits[i];
773 best_term = i - 3;
774 }
775
776 if (!best_term)
777 break;
778
779 term_bits[best_term + 3] = 0;
780
781 info->dps[depth].value = best_term;
782 info->dps[depth].delta = delta;
783 decorr_mono_buffer(samples, outsamples, s->block_samples, info->dps, depth);
784
785 recurse_mono(s, info, depth + 1, delta, local_best_bits);
786 }
787}
788
790{
791 int reversed = 1;
792 uint32_t bits;
793
794 while (reversed) {
795 int ri, i;
796
797 memcpy(info->dps, s->decorr_passes, sizeof(s->decorr_passes));
798 reversed = 0;
799
800 for (ri = 0; ri < info->nterms && s->decorr_passes[ri].value; ri++) {
801
802 if (ri + 1 >= info->nterms || !s->decorr_passes[ri+1].value)
803 break;
804
805 if (s->decorr_passes[ri].value == s->decorr_passes[ri+1].value) {
806 decorr_mono_buffer(s->sampleptrs[ri][0], s->sampleptrs[ri+1][0],
807 s->block_samples, info->dps, ri);
808 continue;
809 }
810
811 info->dps[ri ] = s->decorr_passes[ri+1];
812 info->dps[ri+1] = s->decorr_passes[ri ];
813
814 for (i = ri; i < info->nterms && s->decorr_passes[i].value; i++)
815 decorr_mono_buffer(s->sampleptrs[i][0], s->sampleptrs[i+1][0],
816 s->block_samples, info->dps, i);
817
818 bits = log2mono(s->sampleptrs[i][0], s->block_samples, info->log_limit);
819 if (bits < info->best_bits) {
820 reversed = 1;
821 info->best_bits = bits;
822 CLEAR(s->decorr_passes);
823 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
824 memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
825 s->block_samples * 4);
826 } else {
827 info->dps[ri ] = s->decorr_passes[ri];
828 info->dps[ri+1] = s->decorr_passes[ri+1];
829 decorr_mono_buffer(s->sampleptrs[ri][0], s->sampleptrs[ri+1][0],
830 s->block_samples, info->dps, ri);
831 }
832 }
833 }
834}
835
837{
838 int lower = 0, delta, d;
839 uint32_t bits;
840
841 if (!s->decorr_passes[0].value)
842 return;
843 delta = s->decorr_passes[0].delta;
844
845 for (d = delta - 1; d >= 0; d--) {
846 int i;
847
848 for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
849 info->dps[i].value = s->decorr_passes[i].value;
850 info->dps[i].delta = d;
851 decorr_mono_buffer(s->sampleptrs[i][0], s->sampleptrs[i+1][0],
852 s->block_samples, info->dps, i);
853 }
854
855 bits = log2mono(s->sampleptrs[i][0], s->block_samples, info->log_limit);
856 if (bits >= info->best_bits)
857 break;
858
859 lower = 1;
860 info->best_bits = bits;
861 CLEAR(s->decorr_passes);
862 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
863 memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
864 s->block_samples * 4);
865 }
866
867 for (d = delta + 1; !lower && d <= 7; d++) {
868 int i;
869
870 for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
871 info->dps[i].value = s->decorr_passes[i].value;
872 info->dps[i].delta = d;
873 decorr_mono_buffer(s->sampleptrs[i][0], s->sampleptrs[i+1][0],
874 s->block_samples, info->dps, i);
875 }
876
877 bits = log2mono(s->sampleptrs[i][0], s->block_samples, info->log_limit);
878 if (bits >= info->best_bits)
879 break;
880
881 info->best_bits = bits;
882 CLEAR(s->decorr_passes);
883 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
884 memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
885 s->block_samples * 4);
886 }
887}
888
890{
891 int i;
892
893 for (i = 0; i < nterms + 2; i++) {
894 av_fast_padded_malloc(&s->sampleptrs[i][0], &s->sampleptrs_size[i][0],
895 s->block_samples * 4);
896 if (!s->sampleptrs[i][0])
897 return AVERROR(ENOMEM);
898 if (!(s->flags & WV_MONO_DATA)) {
899 av_fast_padded_malloc(&s->sampleptrs[i][1], &s->sampleptrs_size[i][1],
900 s->block_samples * 4);
901 if (!s->sampleptrs[i][1])
902 return AVERROR(ENOMEM);
903 }
904 }
905
906 return 0;
907}
908
910{
911 int i;
912
913 for (i = 0; i < 2; i++) {
914 av_fast_padded_malloc(&s->best_buffer[0], &s->best_buffer_size[0],
915 s->block_samples * 4);
916 if (!s->best_buffer[0])
917 return AVERROR(ENOMEM);
918
919 av_fast_padded_malloc(&s->temp_buffer[i][0], &s->temp_buffer_size[i][0],
920 s->block_samples * 4);
921 if (!s->temp_buffer[i][0])
922 return AVERROR(ENOMEM);
923 if (!(s->flags & WV_MONO_DATA)) {
924 av_fast_padded_malloc(&s->best_buffer[1], &s->best_buffer_size[1],
925 s->block_samples * 4);
926 if (!s->best_buffer[1])
927 return AVERROR(ENOMEM);
928
929 av_fast_padded_malloc(&s->temp_buffer[i][1], &s->temp_buffer_size[i][1],
930 s->block_samples * 4);
931 if (!s->temp_buffer[i][1])
932 return AVERROR(ENOMEM);
933 }
934 }
935
936 return 0;
937}
938
939static void analyze_mono(WavPackEncodeContext *s, int32_t *samples, int do_samples)
940{
941 WavPackExtraInfo info;
942 int i;
943
944 info.log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
945 info.log_limit = FFMIN(6912, info.log_limit);
946
947 info.nterms = s->num_terms;
948
949 if (allocate_buffers2(s, s->num_terms))
950 return;
951
952 memcpy(info.dps, s->decorr_passes, sizeof(info.dps));
953 memcpy(s->sampleptrs[0][0], samples, s->block_samples * 4);
954
955 for (i = 0; i < info.nterms && info.dps[i].value; i++)
956 decorr_mono(s->sampleptrs[i][0], s->sampleptrs[i + 1][0],
957 s->block_samples, info.dps + i, 1);
958
959 info.best_bits = log2mono(s->sampleptrs[info.nterms][0], s->block_samples, 0) * 1;
960 memcpy(s->sampleptrs[info.nterms + 1][0], s->sampleptrs[i][0], s->block_samples * 4);
961
962 if (s->extra_flags & EXTRA_BRANCHES)
963 recurse_mono(s, &info, 0, (int) floor(s->delta_decay + 0.5),
964 log2mono(s->sampleptrs[0][0], s->block_samples, 0));
965
966 if (s->extra_flags & EXTRA_SORT_FIRST)
967 sort_mono(s, &info);
968
969 if (s->extra_flags & EXTRA_TRY_DELTAS) {
970 delta_mono(s, &info);
971
972 if ((s->extra_flags & EXTRA_ADJUST_DELTAS) && s->decorr_passes[0].value)
973 s->delta_decay = (float)((s->delta_decay * 2.0 + s->decorr_passes[0].delta) / 3.0);
974 else
975 s->delta_decay = 2.0;
976 }
977
978 if (s->extra_flags & EXTRA_SORT_LAST)
979 sort_mono(s, &info);
980
981 if (do_samples)
982 memcpy(samples, s->sampleptrs[info.nterms + 1][0], s->block_samples * 4);
983
984 for (i = 0; i < info.nterms; i++)
985 if (!s->decorr_passes[i].value)
986 break;
987
988 s->num_terms = i;
989}
990
992 int32_t *samples, int nb_samples, int dir)
993{
994 if (dir < 0)
995 samples += nb_samples - 1;
996
997 while (nb_samples--) {
998 uint32_t low, value = FFABSU(samples[0]);
999
1000 if (value < GET_MED(0)) {
1001 DEC_MED(0);
1002 } else {
1003 low = GET_MED(0);
1004 INC_MED(0);
1005
1006 if (value - low < GET_MED(1)) {
1007 DEC_MED(1);
1008 } else {
1009 low += GET_MED(1);
1010 INC_MED(1);
1011
1012 if (value - low < GET_MED(2)) {
1013 DEC_MED(2);
1014 } else {
1015 INC_MED(2);
1016 }
1017 }
1018 }
1019 samples += dir;
1020 }
1021}
1022
1024 int no_history, int do_samples)
1025{
1026 struct Decorr temp_decorr_pass, save_decorr_passes[MAX_TERMS] = {{0}};
1027 int nb_samples = s->block_samples;
1028 int buf_size = sizeof(int32_t) * nb_samples;
1029 uint32_t best_size = UINT32_MAX, size;
1030 int log_limit, pi, i, ret;
1031
1032 for (i = 0; i < nb_samples; i++)
1033 if (samples[i])
1034 break;
1035
1036 if (i == nb_samples) {
1037 CLEAR(s->decorr_passes);
1038 CLEAR(s->w);
1039 s->num_terms = 0;
1040 return 0;
1041 }
1042
1043 log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
1044 log_limit = FFMIN(6912, log_limit);
1045
1046 if ((ret = allocate_buffers(s)) < 0)
1047 return ret;
1048
1049 if (no_history || s->num_passes >= 7)
1050 s->best_decorr = s->mask_decorr = 0;
1051
1052 for (pi = 0; pi < s->num_passes;) {
1053 const WavPackDecorrSpec *wpds;
1054 int nterms, c, j;
1055
1056 if (!pi) {
1057 c = s->best_decorr;
1058 } else {
1059 if (s->mask_decorr == 0)
1060 c = 0;
1061 else
1062 c = (s->best_decorr & (s->mask_decorr - 1)) | s->mask_decorr;
1063
1064 if (c == s->best_decorr) {
1065 s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
1066 continue;
1067 }
1068 }
1069
1070 wpds = &s->decorr_specs[c];
1071 nterms = decorr_filter_nterms[s->decorr_filter];
1072
1073 while (1) {
1074 memcpy(s->temp_buffer[0][0], samples, buf_size);
1075 CLEAR(save_decorr_passes);
1076
1077 for (j = 0; j < nterms; j++) {
1078 CLEAR(temp_decorr_pass);
1079 temp_decorr_pass.delta = wpds->delta;
1080 temp_decorr_pass.value = wpds->terms[j];
1081
1082 if (temp_decorr_pass.value < 0)
1083 temp_decorr_pass.value = 1;
1084
1085 decorr_mono(s->temp_buffer[j&1][0], s->temp_buffer[~j&1][0],
1086 FFMIN(nb_samples, 2048), &temp_decorr_pass, -1);
1087
1088 if (j) {
1089 CLEAR(temp_decorr_pass.samplesA);
1090 } else {
1091 reverse_mono_decorr(&temp_decorr_pass);
1092 }
1093
1094 memcpy(save_decorr_passes + j, &temp_decorr_pass, sizeof(struct Decorr));
1095 decorr_mono(s->temp_buffer[j&1][0], s->temp_buffer[~j&1][0],
1096 nb_samples, &temp_decorr_pass, 1);
1097 }
1098
1099 size = log2mono(s->temp_buffer[j&1][0], nb_samples, log_limit);
1100 if (size != UINT32_MAX || !nterms)
1101 break;
1102 nterms >>= 1;
1103 }
1104
1105 if (size < best_size) {
1106 memcpy(s->best_buffer[0], s->temp_buffer[j&1][0], buf_size);
1107 memcpy(s->decorr_passes, save_decorr_passes, sizeof(struct Decorr) * MAX_TERMS);
1108 s->num_terms = nterms;
1109 s->best_decorr = c;
1110 best_size = size;
1111 }
1112
1113 if (pi++)
1114 s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
1115 }
1116
1117 if (s->extra_flags)
1118 analyze_mono(s, samples, do_samples);
1119 else if (do_samples)
1120 memcpy(samples, s->best_buffer[0], buf_size);
1121
1122 if (no_history || s->extra_flags) {
1123 CLEAR(s->w);
1124 scan_word(s, &s->w.c[0], s->best_buffer[0], nb_samples, -1);
1125 }
1126 return 0;
1127}
1128
1129static void decorr_stereo(int32_t *in_left, int32_t *in_right,
1130 int32_t *out_left, int32_t *out_right,
1131 int nb_samples, struct Decorr *dpp, int dir)
1132{
1133 int m = 0, i;
1134
1135 dpp->sumA = dpp->sumB = 0;
1136
1137 if (dir < 0) {
1138 out_left += nb_samples - 1;
1139 out_right += nb_samples - 1;
1140 in_left += nb_samples - 1;
1141 in_right += nb_samples - 1;
1142 }
1143
1146
1147 for (i = 0; i < MAX_TERM; i++) {
1148 dpp->samplesA[i] = wp_exp2(log2s(dpp->samplesA[i]));
1149 dpp->samplesB[i] = wp_exp2(log2s(dpp->samplesB[i]));
1150 }
1151
1152 switch (dpp->value) {
1153 case 2:
1154 while (nb_samples--) {
1155 int32_t sam, tmp;
1156
1157 sam = dpp->samplesA[0];
1158 dpp->samplesA[0] = dpp->samplesA[1];
1159 out_left[0] = tmp = (dpp->samplesA[1] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
1160 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1161 dpp->sumA += dpp->weightA;
1162
1163 sam = dpp->samplesB[0];
1164 dpp->samplesB[0] = dpp->samplesB[1];
1165 out_right[0] = tmp = (dpp->samplesB[1] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam);
1166 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1167 dpp->sumB += dpp->weightB;
1168
1169 in_left += dir;
1170 out_left += dir;
1171 in_right += dir;
1172 out_right += dir;
1173 }
1174 break;
1175 case 17:
1176 while (nb_samples--) {
1177 int32_t sam, tmp;
1178
1179 sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
1180 dpp->samplesA[1] = dpp->samplesA[0];
1181 out_left[0] = tmp = (dpp->samplesA[0] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
1182 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1183 dpp->sumA += dpp->weightA;
1184
1185 sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
1186 dpp->samplesB[1] = dpp->samplesB[0];
1187 out_right[0] = tmp = (dpp->samplesB[0] = in_right[0]) - APPLY_WEIGHT (dpp->weightB, sam);
1188 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1189 dpp->sumB += dpp->weightB;
1190
1191 in_left += dir;
1192 out_left += dir;
1193 in_right += dir;
1194 out_right += dir;
1195 }
1196 break;
1197 case 18:
1198 while (nb_samples--) {
1199 int32_t sam, tmp;
1200
1201 sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
1202 dpp->samplesA[1] = dpp->samplesA[0];
1203 out_left[0] = tmp = (dpp->samplesA[0] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
1204 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1205 dpp->sumA += dpp->weightA;
1206
1207 sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
1208 dpp->samplesB[1] = dpp->samplesB[0];
1209 out_right[0] = tmp = (dpp->samplesB[0] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam);
1210 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1211 dpp->sumB += dpp->weightB;
1212
1213 in_left += dir;
1214 out_left += dir;
1215 in_right += dir;
1216 out_right += dir;
1217 }
1218 break;
1219 default: {
1220 int k = dpp->value & (MAX_TERM - 1);
1221
1222 while (nb_samples--) {
1223 int32_t sam, tmp;
1224
1225 sam = dpp->samplesA[m];
1226 out_left[0] = tmp = (dpp->samplesA[k] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
1227 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1228 dpp->sumA += dpp->weightA;
1229
1230 sam = dpp->samplesB[m];
1231 out_right[0] = tmp = (dpp->samplesB[k] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam);
1232 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1233 dpp->sumB += dpp->weightB;
1234
1235 in_left += dir;
1236 out_left += dir;
1237 in_right += dir;
1238 out_right += dir;
1239 m = (m + 1) & (MAX_TERM - 1);
1240 k = (k + 1) & (MAX_TERM - 1);
1241 }
1242
1243 if (m) {
1244 int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
1245 int k;
1246
1247 memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
1248 memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
1249
1250 for (k = 0; k < MAX_TERM; k++) {
1251 dpp->samplesA[k] = temp_A[m];
1252 dpp->samplesB[k] = temp_B[m];
1253 m = (m + 1) & (MAX_TERM - 1);
1254 }
1255 }
1256 break;
1257 }
1258 case -1:
1259 while (nb_samples--) {
1260 int32_t sam_A, sam_B, tmp;
1261
1262 sam_A = dpp->samplesA[0];
1263 out_left[0] = tmp = (sam_B = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam_A);
1264 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
1265 dpp->sumA += dpp->weightA;
1266
1267 out_right[0] = tmp = (dpp->samplesA[0] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam_B);
1268 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
1269 dpp->sumB += dpp->weightB;
1270
1271 in_left += dir;
1272 out_left += dir;
1273 in_right += dir;
1274 out_right += dir;
1275 }
1276 break;
1277 case -2:
1278 while (nb_samples--) {
1279 int32_t sam_A, sam_B, tmp;
1280
1281 sam_B = dpp->samplesB[0];
1282 out_right[0] = tmp = (sam_A = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam_B);
1283 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
1284 dpp->sumB += dpp->weightB;
1285
1286 out_left[0] = tmp = (dpp->samplesB[0] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam_A);
1287 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
1288 dpp->sumA += dpp->weightA;
1289
1290 in_left += dir;
1291 out_left += dir;
1292 in_right += dir;
1293 out_right += dir;
1294 }
1295 break;
1296 case -3:
1297 while (nb_samples--) {
1298 int32_t sam_A, sam_B, tmp;
1299
1300 sam_A = dpp->samplesA[0];
1301 sam_B = dpp->samplesB[0];
1302
1303 dpp->samplesA[0] = tmp = in_right[0];
1304 out_right[0] = tmp -= APPLY_WEIGHT(dpp->weightB, sam_B);
1305 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
1306 dpp->sumB += dpp->weightB;
1307
1308 dpp->samplesB[0] = tmp = in_left[0];
1309 out_left[0] = tmp -= APPLY_WEIGHT(dpp->weightA, sam_A);
1310 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
1311 dpp->sumA += dpp->weightA;
1312
1313 in_left += dir;
1314 out_left += dir;
1315 in_right += dir;
1316 out_right += dir;
1317 }
1318 break;
1319 }
1320}
1321
1322static void reverse_decorr(struct Decorr *dpp)
1323{
1324 if (dpp->value > MAX_TERM) {
1325 int32_t sam_A, sam_B;
1326
1327 if (dpp->value & 1) {
1328 sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
1329 sam_B = 2 * dpp->samplesB[0] - dpp->samplesB[1];
1330 } else {
1331 sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
1332 sam_B = (3 * dpp->samplesB[0] - dpp->samplesB[1]) >> 1;
1333 }
1334
1335 dpp->samplesA[1] = dpp->samplesA[0];
1336 dpp->samplesB[1] = dpp->samplesB[0];
1337 dpp->samplesA[0] = sam_A;
1338 dpp->samplesB[0] = sam_B;
1339
1340 if (dpp->value & 1) {
1341 sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
1342 sam_B = 2 * dpp->samplesB[0] - dpp->samplesB[1];
1343 } else {
1344 sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
1345 sam_B = (3 * dpp->samplesB[0] - dpp->samplesB[1]) >> 1;
1346 }
1347
1348 dpp->samplesA[1] = sam_A;
1349 dpp->samplesB[1] = sam_B;
1350 } else if (dpp->value > 1) {
1351 int i, j, k;
1352
1353 for (i = 0, j = dpp->value - 1, k = 0; k < dpp->value / 2; i++, j--, k++) {
1354 i &= (MAX_TERM - 1);
1355 j &= (MAX_TERM - 1);
1356 dpp->samplesA[i] ^= dpp->samplesA[j];
1357 dpp->samplesA[j] ^= dpp->samplesA[i];
1358 dpp->samplesA[i] ^= dpp->samplesA[j];
1359 dpp->samplesB[i] ^= dpp->samplesB[j];
1360 dpp->samplesB[j] ^= dpp->samplesB[i];
1361 dpp->samplesB[i] ^= dpp->samplesB[j];
1362 }
1363 }
1364}
1365
1366static void decorr_stereo_quick(int32_t *in_left, int32_t *in_right,
1367 int32_t *out_left, int32_t *out_right,
1368 int nb_samples, struct Decorr *dpp)
1369{
1370 int m = 0, i;
1371
1374
1375 for (i = 0; i < MAX_TERM; i++) {
1376 dpp->samplesA[i] = wp_exp2(log2s(dpp->samplesA[i]));
1377 dpp->samplesB[i] = wp_exp2(log2s(dpp->samplesB[i]));
1378 }
1379
1380 switch (dpp->value) {
1381 case 2:
1382 for (i = 0; i < nb_samples; i++) {
1383 int32_t sam, tmp;
1384
1385 sam = dpp->samplesA[0];
1386 dpp->samplesA[0] = dpp->samplesA[1];
1387 out_left[i] = tmp = (dpp->samplesA[1] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
1388 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1389
1390 sam = dpp->samplesB[0];
1391 dpp->samplesB[0] = dpp->samplesB[1];
1392 out_right[i] = tmp = (dpp->samplesB[1] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
1393 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1394 }
1395 break;
1396 case 17:
1397 for (i = 0; i < nb_samples; i++) {
1398 int32_t sam, tmp;
1399
1400 sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
1401 dpp->samplesA[1] = dpp->samplesA[0];
1402 out_left[i] = tmp = (dpp->samplesA[0] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
1403 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1404
1405 sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
1406 dpp->samplesB[1] = dpp->samplesB[0];
1407 out_right[i] = tmp = (dpp->samplesB[0] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
1408 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1409 }
1410 break;
1411 case 18:
1412 for (i = 0; i < nb_samples; i++) {
1413 int32_t sam, tmp;
1414
1415 sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
1416 dpp->samplesA[1] = dpp->samplesA[0];
1417 out_left[i] = tmp = (dpp->samplesA[0] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
1418 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1419
1420 sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
1421 dpp->samplesB[1] = dpp->samplesB[0];
1422 out_right[i] = tmp = (dpp->samplesB[0] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
1423 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1424 }
1425 break;
1426 default: {
1427 int k = dpp->value & (MAX_TERM - 1);
1428
1429 for (i = 0; i < nb_samples; i++) {
1430 int32_t sam, tmp;
1431
1432 sam = dpp->samplesA[m];
1433 out_left[i] = tmp = (dpp->samplesA[k] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
1434 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
1435
1436 sam = dpp->samplesB[m];
1437 out_right[i] = tmp = (dpp->samplesB[k] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
1438 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
1439
1440 m = (m + 1) & (MAX_TERM - 1);
1441 k = (k + 1) & (MAX_TERM - 1);
1442 }
1443
1444 if (m) {
1445 int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
1446 int k;
1447
1448 memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
1449 memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
1450
1451 for (k = 0; k < MAX_TERM; k++) {
1452 dpp->samplesA[k] = temp_A[m];
1453 dpp->samplesB[k] = temp_B[m];
1454 m = (m + 1) & (MAX_TERM - 1);
1455 }
1456 }
1457 break;
1458 }
1459 case -1:
1460 for (i = 0; i < nb_samples; i++) {
1461 int32_t sam_A, sam_B, tmp;
1462
1463 sam_A = dpp->samplesA[0];
1464 out_left[i] = tmp = (sam_B = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
1465 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
1466
1467 out_right[i] = tmp = (dpp->samplesA[0] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
1468 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
1469 }
1470 break;
1471 case -2:
1472 for (i = 0; i < nb_samples; i++) {
1473 int32_t sam_A, sam_B, tmp;
1474
1475 sam_B = dpp->samplesB[0];
1476 out_right[i] = tmp = (sam_A = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
1477 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
1478
1479 out_left[i] = tmp = (dpp->samplesB[0] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
1480 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
1481 }
1482 break;
1483 case -3:
1484 for (i = 0; i < nb_samples; i++) {
1485 int32_t sam_A, sam_B, tmp;
1486
1487 sam_A = dpp->samplesA[0];
1488 sam_B = dpp->samplesB[0];
1489
1490 dpp->samplesA[0] = tmp = in_right[i];
1491 out_right[i] = tmp -= APPLY_WEIGHT_I(dpp->weightB, sam_B);
1492 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
1493
1494 dpp->samplesB[0] = tmp = in_left[i];
1495 out_left[i] = tmp -= APPLY_WEIGHT_I(dpp->weightA, sam_A);
1496 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
1497 }
1498 break;
1499 }
1500}
1501
1503 int32_t *in_left, int32_t *in_right,
1504 int32_t *out_left, int32_t *out_right,
1505 int nb_samples, int tindex)
1506{
1507 struct Decorr dp = {0}, *dppi = info->dps + tindex;
1508 int delta = dppi->delta, pre_delta;
1509 int term = dppi->value;
1510
1511 if (delta == 7)
1512 pre_delta = 7;
1513 else if (delta < 2)
1514 pre_delta = 3;
1515 else
1516 pre_delta = delta + 1;
1517
1518 dp.value = term;
1519 dp.delta = pre_delta;
1520 decorr_stereo(in_left, in_right, out_left, out_right,
1521 FFMIN(2048, nb_samples), &dp, -1);
1522 dp.delta = delta;
1523
1524 if (tindex == 0) {
1525 reverse_decorr(&dp);
1526 } else {
1527 CLEAR(dp.samplesA);
1528 CLEAR(dp.samplesB);
1529 }
1530
1531 memcpy(dppi->samplesA, dp.samplesA, sizeof(dp.samplesA));
1532 memcpy(dppi->samplesB, dp.samplesB, sizeof(dp.samplesB));
1533 dppi->weightA = dp.weightA;
1534 dppi->weightB = dp.weightB;
1535
1536 if (delta == 0) {
1537 dp.delta = 1;
1538 decorr_stereo(in_left, in_right, out_left, out_right, nb_samples, &dp, 1);
1539 dp.delta = 0;
1540 memcpy(dp.samplesA, dppi->samplesA, sizeof(dp.samplesA));
1541 memcpy(dp.samplesB, dppi->samplesB, sizeof(dp.samplesB));
1542 dppi->weightA = dp.weightA = dp.sumA / nb_samples;
1543 dppi->weightB = dp.weightB = dp.sumB / nb_samples;
1544 }
1545
1546 if (info->gt16bit)
1547 decorr_stereo(in_left, in_right, out_left, out_right,
1548 nb_samples, &dp, 1);
1549 else
1550 decorr_stereo_quick(in_left, in_right, out_left, out_right,
1551 nb_samples, &dp);
1552}
1553
1555{
1556 int reversed = 1;
1557 uint32_t bits;
1558
1559 while (reversed) {
1560 int ri, i;
1561
1562 memcpy(info->dps, s->decorr_passes, sizeof(s->decorr_passes));
1563 reversed = 0;
1564
1565 for (ri = 0; ri < info->nterms && s->decorr_passes[ri].value; ri++) {
1566
1567 if (ri + 1 >= info->nterms || !s->decorr_passes[ri+1].value)
1568 break;
1569
1570 if (s->decorr_passes[ri].value == s->decorr_passes[ri+1].value) {
1572 s->sampleptrs[ri ][0], s->sampleptrs[ri ][1],
1573 s->sampleptrs[ri+1][0], s->sampleptrs[ri+1][1],
1574 s->block_samples, ri);
1575 continue;
1576 }
1577
1578 info->dps[ri ] = s->decorr_passes[ri+1];
1579 info->dps[ri+1] = s->decorr_passes[ri ];
1580
1581 for (i = ri; i < info->nterms && s->decorr_passes[i].value; i++)
1583 s->sampleptrs[i ][0], s->sampleptrs[i ][1],
1584 s->sampleptrs[i+1][0], s->sampleptrs[i+1][1],
1585 s->block_samples, i);
1586
1587 bits = log2stereo(s->sampleptrs[i][0], s->sampleptrs[i][1],
1588 s->block_samples, info->log_limit);
1589
1590 if (bits < info->best_bits) {
1591 reversed = 1;
1592 info->best_bits = bits;
1593 CLEAR(s->decorr_passes);
1594 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
1595 memcpy(s->sampleptrs[info->nterms + 1][0],
1596 s->sampleptrs[i][0], s->block_samples * 4);
1597 memcpy(s->sampleptrs[info->nterms + 1][1],
1598 s->sampleptrs[i][1], s->block_samples * 4);
1599 } else {
1600 info->dps[ri ] = s->decorr_passes[ri ];
1601 info->dps[ri+1] = s->decorr_passes[ri+1];
1603 s->sampleptrs[ri ][0], s->sampleptrs[ri ][1],
1604 s->sampleptrs[ri+1][0], s->sampleptrs[ri+1][1],
1605 s->block_samples, ri);
1606 }
1607 }
1608 }
1609}
1610
1612{
1613 int lower = 0, delta, d, i;
1614 uint32_t bits;
1615
1616 if (!s->decorr_passes[0].value)
1617 return;
1618 delta = s->decorr_passes[0].delta;
1619
1620 for (d = delta - 1; d >= 0; d--) {
1621 for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
1622 info->dps[i].value = s->decorr_passes[i].value;
1623 info->dps[i].delta = d;
1625 s->sampleptrs[i ][0], s->sampleptrs[i ][1],
1626 s->sampleptrs[i+1][0], s->sampleptrs[i+1][1],
1627 s->block_samples, i);
1628 }
1629
1630 bits = log2stereo(s->sampleptrs[i][0], s->sampleptrs[i][1],
1631 s->block_samples, info->log_limit);
1632 if (bits >= info->best_bits)
1633 break;
1634 lower = 1;
1635 info->best_bits = bits;
1636 CLEAR(s->decorr_passes);
1637 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
1638 memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
1639 s->block_samples * 4);
1640 memcpy(s->sampleptrs[info->nterms + 1][1], s->sampleptrs[i][1],
1641 s->block_samples * 4);
1642 }
1643
1644 for (d = delta + 1; !lower && d <= 7; d++) {
1645 for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
1646 info->dps[i].value = s->decorr_passes[i].value;
1647 info->dps[i].delta = d;
1649 s->sampleptrs[i ][0], s->sampleptrs[i ][1],
1650 s->sampleptrs[i+1][0], s->sampleptrs[i+1][1],
1651 s->block_samples, i);
1652 }
1653
1654 bits = log2stereo(s->sampleptrs[i][0], s->sampleptrs[i][1],
1655 s->block_samples, info->log_limit);
1656
1657 if (bits < info->best_bits) {
1658 info->best_bits = bits;
1659 CLEAR(s->decorr_passes);
1660 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
1661 memcpy(s->sampleptrs[info->nterms + 1][0],
1662 s->sampleptrs[i][0], s->block_samples * 4);
1663 memcpy(s->sampleptrs[info->nterms + 1][1],
1664 s->sampleptrs[i][1], s->block_samples * 4);
1665 }
1666 else
1667 break;
1668 }
1669}
1670
1672 int depth, int delta, uint32_t input_bits)
1673{
1674 int term, branches = s->num_branches - depth;
1675 int32_t *in_left, *in_right, *out_left, *out_right;
1676 uint32_t term_bits[22], bits;
1677
1678 if (branches < 1 || depth + 1 == info->nterms)
1679 branches = 1;
1680
1681 CLEAR(term_bits);
1682 in_left = s->sampleptrs[depth ][0];
1683 in_right = s->sampleptrs[depth ][1];
1684 out_left = s->sampleptrs[depth + 1][0];
1685 out_right = s->sampleptrs[depth + 1][1];
1686
1687 for (term = -3; term <= 18; term++) {
1688 if (!term || (term > 8 && term < 17))
1689 continue;
1690
1691 if (term == 17 && branches == 1 && depth + 1 < info->nterms)
1692 continue;
1693
1694 if (term == -1 || term == -2)
1695 if (!(s->flags & WV_CROSS_DECORR))
1696 continue;
1697
1698 if (!s->extra_flags && (term > 4 && term < 17))
1699 continue;
1700
1701 info->dps[depth].value = term;
1702 info->dps[depth].delta = delta;
1703 decorr_stereo_buffer(info, in_left, in_right, out_left, out_right,
1704 s->block_samples, depth);
1705 bits = log2stereo(out_left, out_right, s->block_samples, info->log_limit);
1706
1707 if (bits < info->best_bits) {
1708 info->best_bits = bits;
1709 CLEAR(s->decorr_passes);
1710 memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * (depth + 1));
1711 memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[depth + 1][0],
1712 s->block_samples * 4);
1713 memcpy(s->sampleptrs[info->nterms + 1][1], s->sampleptrs[depth + 1][1],
1714 s->block_samples * 4);
1715 }
1716
1717 term_bits[term + 3] = bits;
1718 }
1719
1720 while (depth + 1 < info->nterms && branches--) {
1721 uint32_t local_best_bits = input_bits;
1722 int best_term = 0, i;
1723
1724 for (i = 0; i < 22; i++)
1725 if (term_bits[i] && term_bits[i] < local_best_bits) {
1726 local_best_bits = term_bits[i];
1727 best_term = i - 3;
1728 }
1729
1730 if (!best_term)
1731 break;
1732
1733 term_bits[best_term + 3] = 0;
1734
1735 info->dps[depth].value = best_term;
1736 info->dps[depth].delta = delta;
1737 decorr_stereo_buffer(info, in_left, in_right, out_left, out_right,
1738 s->block_samples, depth);
1739
1740 recurse_stereo(s, info, depth + 1, delta, local_best_bits);
1741 }
1742}
1743
1745 int32_t *in_left, int32_t *in_right,
1746 int do_samples)
1747{
1748 WavPackExtraInfo info;
1749 int i;
1750
1751 info.gt16bit = ((s->flags & MAG_MASK) >> MAG_LSB) >= 16;
1752
1753 info.log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
1754 info.log_limit = FFMIN(6912, info.log_limit);
1755
1756 info.nterms = s->num_terms;
1757
1758 if (allocate_buffers2(s, s->num_terms))
1759 return;
1760
1761 memcpy(info.dps, s->decorr_passes, sizeof(info.dps));
1762 memcpy(s->sampleptrs[0][0], in_left, s->block_samples * 4);
1763 memcpy(s->sampleptrs[0][1], in_right, s->block_samples * 4);
1764
1765 for (i = 0; i < info.nterms && info.dps[i].value; i++)
1766 if (info.gt16bit)
1767 decorr_stereo(s->sampleptrs[i ][0], s->sampleptrs[i ][1],
1768 s->sampleptrs[i + 1][0], s->sampleptrs[i + 1][1],
1769 s->block_samples, info.dps + i, 1);
1770 else
1771 decorr_stereo_quick(s->sampleptrs[i ][0], s->sampleptrs[i ][1],
1772 s->sampleptrs[i + 1][0], s->sampleptrs[i + 1][1],
1773 s->block_samples, info.dps + i);
1774
1775 info.best_bits = log2stereo(s->sampleptrs[info.nterms][0], s->sampleptrs[info.nterms][1],
1776 s->block_samples, 0);
1777
1778 memcpy(s->sampleptrs[info.nterms + 1][0], s->sampleptrs[i][0], s->block_samples * 4);
1779 memcpy(s->sampleptrs[info.nterms + 1][1], s->sampleptrs[i][1], s->block_samples * 4);
1780
1781 if (s->extra_flags & EXTRA_BRANCHES)
1782 recurse_stereo(s, &info, 0, (int) floor(s->delta_decay + 0.5),
1783 log2stereo(s->sampleptrs[0][0], s->sampleptrs[0][1],
1784 s->block_samples, 0));
1785
1786 if (s->extra_flags & EXTRA_SORT_FIRST)
1787 sort_stereo(s, &info);
1788
1789 if (s->extra_flags & EXTRA_TRY_DELTAS) {
1790 delta_stereo(s, &info);
1791
1792 if ((s->extra_flags & EXTRA_ADJUST_DELTAS) && s->decorr_passes[0].value)
1793 s->delta_decay = (float)((s->delta_decay * 2.0 + s->decorr_passes[0].delta) / 3.0);
1794 else
1795 s->delta_decay = 2.0;
1796 }
1797
1798 if (s->extra_flags & EXTRA_SORT_LAST)
1799 sort_stereo(s, &info);
1800
1801 if (do_samples) {
1802 memcpy(in_left, s->sampleptrs[info.nterms + 1][0], s->block_samples * 4);
1803 memcpy(in_right, s->sampleptrs[info.nterms + 1][1], s->block_samples * 4);
1804 }
1805
1806 for (i = 0; i < info.nterms; i++)
1807 if (!s->decorr_passes[i].value)
1808 break;
1809
1810 s->num_terms = i;
1811}
1812
1814 int32_t *samples_l, int32_t *samples_r,
1815 int no_history, int do_samples)
1816{
1817 struct Decorr temp_decorr_pass, save_decorr_passes[MAX_TERMS] = {{0}};
1818 int nb_samples = s->block_samples, ret;
1819 int buf_size = sizeof(int32_t) * nb_samples;
1820 int log_limit, force_js = 0, force_ts = 0, got_js = 0, pi, i;
1821 uint32_t best_size = UINT32_MAX, size;
1822
1823 for (i = 0; i < nb_samples; i++)
1824 if (samples_l[i] || samples_r[i])
1825 break;
1826
1827 if (i == nb_samples) {
1828 s->flags &= ~((uint32_t) WV_JOINT_STEREO);
1829 CLEAR(s->decorr_passes);
1830 CLEAR(s->w);
1831 s->num_terms = 0;
1832 return 0;
1833 }
1834
1835 log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
1836 log_limit = FFMIN(6912, log_limit);
1837
1838 if (s->joint != -1) {
1839 force_js = s->joint;
1840 force_ts = !s->joint;
1841 }
1842
1843 if ((ret = allocate_buffers(s)) < 0)
1844 return ret;
1845
1846 if (no_history || s->num_passes >= 7)
1847 s->best_decorr = s->mask_decorr = 0;
1848
1849 for (pi = 0; pi < s->num_passes;) {
1850 const WavPackDecorrSpec *wpds;
1851 int nterms, c, j;
1852
1853 if (!pi)
1854 c = s->best_decorr;
1855 else {
1856 if (s->mask_decorr == 0)
1857 c = 0;
1858 else
1859 c = (s->best_decorr & (s->mask_decorr - 1)) | s->mask_decorr;
1860
1861 if (c == s->best_decorr) {
1862 s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
1863 continue;
1864 }
1865 }
1866
1867 wpds = &s->decorr_specs[c];
1868 nterms = decorr_filter_nterms[s->decorr_filter];
1869
1870 while (1) {
1871 if (force_js || (wpds->joint_stereo && !force_ts)) {
1872 if (!got_js) {
1873 av_fast_padded_malloc(&s->js_left, &s->js_left_size, buf_size);
1874 av_fast_padded_malloc(&s->js_right, &s->js_right_size, buf_size);
1875 memcpy(s->js_left, samples_l, buf_size);
1876 memcpy(s->js_right, samples_r, buf_size);
1877
1878 for (i = 0; i < nb_samples; i++)
1879 s->js_right[i] += ((s->js_left[i] -= s->js_right[i]) >> 1);
1880 got_js = 1;
1881 }
1882
1883 memcpy(s->temp_buffer[0][0], s->js_left, buf_size);
1884 memcpy(s->temp_buffer[0][1], s->js_right, buf_size);
1885 } else {
1886 memcpy(s->temp_buffer[0][0], samples_l, buf_size);
1887 memcpy(s->temp_buffer[0][1], samples_r, buf_size);
1888 }
1889
1890 CLEAR(save_decorr_passes);
1891
1892 for (j = 0; j < nterms; j++) {
1893 CLEAR(temp_decorr_pass);
1894 temp_decorr_pass.delta = wpds->delta;
1895 temp_decorr_pass.value = wpds->terms[j];
1896
1897 if (temp_decorr_pass.value < 0 && !(s->flags & WV_CROSS_DECORR))
1898 temp_decorr_pass.value = -3;
1899
1900 decorr_stereo(s->temp_buffer[ j&1][0], s->temp_buffer[ j&1][1],
1901 s->temp_buffer[~j&1][0], s->temp_buffer[~j&1][1],
1902 FFMIN(2048, nb_samples), &temp_decorr_pass, -1);
1903
1904 if (j) {
1905 CLEAR(temp_decorr_pass.samplesA);
1906 CLEAR(temp_decorr_pass.samplesB);
1907 } else {
1908 reverse_decorr(&temp_decorr_pass);
1909 }
1910
1911 memcpy(save_decorr_passes + j, &temp_decorr_pass, sizeof(struct Decorr));
1912
1913 if (((s->flags & MAG_MASK) >> MAG_LSB) >= 16)
1914 decorr_stereo(s->temp_buffer[ j&1][0], s->temp_buffer[ j&1][1],
1915 s->temp_buffer[~j&1][0], s->temp_buffer[~j&1][1],
1916 nb_samples, &temp_decorr_pass, 1);
1917 else
1918 decorr_stereo_quick(s->temp_buffer[ j&1][0], s->temp_buffer[ j&1][1],
1919 s->temp_buffer[~j&1][0], s->temp_buffer[~j&1][1],
1920 nb_samples, &temp_decorr_pass);
1921 }
1922
1923 size = log2stereo(s->temp_buffer[j&1][0], s->temp_buffer[j&1][1],
1924 nb_samples, log_limit);
1925 if (size != UINT32_MAX || !nterms)
1926 break;
1927 nterms >>= 1;
1928 }
1929
1930 if (size < best_size) {
1931 memcpy(s->best_buffer[0], s->temp_buffer[j&1][0], buf_size);
1932 memcpy(s->best_buffer[1], s->temp_buffer[j&1][1], buf_size);
1933 memcpy(s->decorr_passes, save_decorr_passes, sizeof(struct Decorr) * MAX_TERMS);
1934 s->num_terms = nterms;
1935 s->best_decorr = c;
1936 best_size = size;
1937 }
1938
1939 if (pi++)
1940 s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
1941 }
1942
1943 if (force_js || (s->decorr_specs[s->best_decorr].joint_stereo && !force_ts))
1944 s->flags |= WV_JOINT_STEREO;
1945 else
1946 s->flags &= ~((uint32_t) WV_JOINT_STEREO);
1947
1948 if (s->extra_flags) {
1949 if (s->flags & WV_JOINT_STEREO) {
1950 analyze_stereo(s, s->js_left, s->js_right, do_samples);
1951
1952 if (do_samples) {
1953 memcpy(samples_l, s->js_left, buf_size);
1954 memcpy(samples_r, s->js_right, buf_size);
1955 }
1956 } else
1957 analyze_stereo(s, samples_l, samples_r, do_samples);
1958 } else if (do_samples) {
1959 memcpy(samples_l, s->best_buffer[0], buf_size);
1960 memcpy(samples_r, s->best_buffer[1], buf_size);
1961 }
1962
1963 if (s->extra_flags || no_history ||
1964 s->joint_stereo != s->decorr_specs[s->best_decorr].joint_stereo) {
1965 s->joint_stereo = s->decorr_specs[s->best_decorr].joint_stereo;
1966 CLEAR(s->w);
1967 scan_word(s, &s->w.c[0], s->best_buffer[0], nb_samples, -1);
1968 scan_word(s, &s->w.c[1], s->best_buffer[1], nb_samples, -1);
1969 }
1970 return 0;
1971}
1972
1974{
1975 WavPackWords *w = &s->w;
1976 PutBitContext *pb = &s->pb;
1977
1978 if (w->zeros_acc) {
1979 int cbits = count_bits(w->zeros_acc);
1980
1981 do {
1982 if (cbits > 31) {
1983 put_bits(pb, 31, 0x7FFFFFFF);
1984 cbits -= 31;
1985 } else {
1986 put_bits(pb, cbits, (1U << cbits) - 1);
1987 cbits = 0;
1988 }
1989 } while (cbits);
1990
1991 put_bits(pb, 1, 0);
1992
1993 while (w->zeros_acc > 1) {
1994 put_bits(pb, 1, w->zeros_acc & 1);
1995 w->zeros_acc >>= 1;
1996 }
1997
1998 w->zeros_acc = 0;
1999 }
2000
2001 if (w->holding_one) {
2002 if (w->holding_one >= 16) {
2003 int cbits;
2004
2005 put_bits(pb, 16, (1 << 16) - 1);
2006 put_bits(pb, 1, 0);
2007 w->holding_one -= 16;
2008 cbits = count_bits(w->holding_one);
2009
2010 do {
2011 if (cbits > 31) {
2012 put_bits(pb, 31, 0x7FFFFFFF);
2013 cbits -= 31;
2014 } else {
2015 put_bits(pb, cbits, (1U << cbits) - 1);
2016 cbits = 0;
2017 }
2018 } while (cbits);
2019
2020 put_bits(pb, 1, 0);
2021
2022 while (w->holding_one > 1) {
2023 put_bits(pb, 1, w->holding_one & 1);
2024 w->holding_one >>= 1;
2025 }
2026
2027 w->holding_zero = 0;
2028 } else {
2029 put_bits(pb, w->holding_one, (1 << w->holding_one) - 1);
2030 }
2031
2032 w->holding_one = 0;
2033 }
2034
2035 if (w->holding_zero) {
2036 put_bits(pb, 1, 0);
2037 w->holding_zero = 0;
2038 }
2039
2040 if (w->pend_count) {
2041 put_bits(pb, w->pend_count, w->pend_data);
2042 w->pend_data = w->pend_count = 0;
2043 }
2044}
2045
2047{
2048 WavPackWords *w = &s->w;
2049 uint32_t ones_count, low, high;
2050 int sign = sample < 0;
2051
2052 if (s->w.c[0].median[0] < 2 && !s->w.holding_zero && s->w.c[1].median[0] < 2) {
2053 if (w->zeros_acc) {
2054 if (sample)
2055 encode_flush(s);
2056 else {
2057 w->zeros_acc++;
2058 return;
2059 }
2060 } else if (sample) {
2061 put_bits(&s->pb, 1, 0);
2062 } else {
2063 CLEAR(s->w.c[0].median);
2064 CLEAR(s->w.c[1].median);
2065 w->zeros_acc = 1;
2066 return;
2067 }
2068 }
2069
2070 if (sign)
2071 sample = ~sample;
2072
2073 if (sample < (int32_t) GET_MED(0)) {
2074 ones_count = low = 0;
2075 high = GET_MED(0) - 1;
2076 DEC_MED(0);
2077 } else {
2078 low = GET_MED(0);
2079 INC_MED(0);
2080
2081 if (sample - low < GET_MED(1)) {
2082 ones_count = 1;
2083 high = low + GET_MED(1) - 1;
2084 DEC_MED(1);
2085 } else {
2086 low += GET_MED(1);
2087 INC_MED(1);
2088
2089 if (sample - low < GET_MED(2)) {
2090 ones_count = 2;
2091 high = low + GET_MED(2) - 1;
2092 DEC_MED(2);
2093 } else {
2094 ones_count = 2 + (sample - low) / GET_MED(2);
2095 low += (ones_count - 2) * GET_MED(2);
2096 high = low + GET_MED(2) - 1;
2097 INC_MED(2);
2098 }
2099 }
2100 }
2101
2102 if (w->holding_zero) {
2103 if (ones_count)
2104 w->holding_one++;
2105
2106 encode_flush(s);
2107
2108 if (ones_count) {
2109 w->holding_zero = 1;
2110 ones_count--;
2111 } else
2112 w->holding_zero = 0;
2113 } else
2114 w->holding_zero = 1;
2115
2116 w->holding_one = ones_count * 2;
2117
2118 if (high != low) {
2119 uint32_t maxcode = high - low, code = sample - low;
2120 int bitcount = count_bits(maxcode);
2121 uint32_t extras = (1 << bitcount) - maxcode - 1;
2122
2123 if (code < extras) {
2124 w->pend_data |= code << w->pend_count;
2125 w->pend_count += bitcount - 1;
2126 } else {
2127 w->pend_data |= ((code + extras) >> 1) << w->pend_count;
2128 w->pend_count += bitcount - 1;
2129 w->pend_data |= ((code + extras) & 1) << w->pend_count++;
2130 }
2131 }
2132
2133 w->pend_data |= ((int32_t) sign << w->pend_count++);
2134
2135 if (!w->holding_zero)
2136 encode_flush(s);
2137}
2138
2140 int32_t *samples_l, int32_t *samples_r,
2141 int nb_samples)
2142{
2143 const int sent_bits = s->int32_sent_bits;
2144 PutBitContext *pb = &s->pb;
2145 int i, pre_shift;
2146
2147 pre_shift = s->int32_zeros + s->int32_ones + s->int32_dups;
2148
2149 if (!sent_bits)
2150 return;
2151
2152 if (s->flags & WV_MONO_DATA) {
2153 for (i = 0; i < nb_samples; i++) {
2154 put_sbits(pb, sent_bits, samples_l[i] >> pre_shift);
2155 }
2156 } else {
2157 for (i = 0; i < nb_samples; i++) {
2158 put_sbits(pb, sent_bits, samples_l[i] >> pre_shift);
2159 put_sbits(pb, sent_bits, samples_r[i] >> pre_shift);
2160 }
2161 }
2162}
2163
2165{
2166 const int max_exp = s->float_max_exp;
2167 PutBitContext *pb = &s->pb;
2168 int32_t value, shift_count;
2169
2170 if (get_exponent(*sample) == 255) {
2171 if (get_mantissa(*sample)) {
2172 put_bits(pb, 1, 1);
2173 put_bits(pb, 23, get_mantissa(*sample));
2174 } else {
2175 put_bits(pb, 1, 0);
2176 }
2177
2178 value = 0x1000000;
2179 shift_count = 0;
2180 } else if (get_exponent(*sample)) {
2181 shift_count = max_exp - get_exponent(*sample);
2182 value = 0x800000 + get_mantissa(*sample);
2183 } else {
2184 shift_count = max_exp ? max_exp - 1 : 0;
2186 }
2187
2188 if (shift_count < 25)
2189 value >>= shift_count;
2190 else
2191 value = 0;
2192
2193 if (!value) {
2194 if (s->float_flags & FLOAT_ZEROS_SENT) {
2196 put_bits(pb, 1, 1);
2197 put_bits(pb, 23, get_mantissa(*sample));
2198
2199 if (max_exp >= 25)
2200 put_bits(pb, 8, get_exponent(*sample));
2201
2202 put_bits(pb, 1, get_sign(*sample));
2203 } else {
2204 put_bits(pb, 1, 0);
2205
2206 if (s->float_flags & FLOAT_NEG_ZEROS)
2207 put_bits(pb, 1, get_sign(*sample));
2208 }
2209 }
2210 } else if (shift_count) {
2211 if (s->float_flags & FLOAT_SHIFT_SENT) {
2212 put_sbits(pb, shift_count, get_mantissa(*sample));
2213 } else if (s->float_flags & FLOAT_SHIFT_SAME) {
2214 put_bits(pb, 1, get_mantissa(*sample) & 1);
2215 }
2216 }
2217}
2218
2220 int32_t *samples_l, int32_t *samples_r,
2221 int nb_samples)
2222{
2223 int i;
2224
2225 if (s->flags & WV_MONO_DATA) {
2226 for (i = 0; i < nb_samples; i++)
2227 pack_float_sample(s, &samples_l[i]);
2228 } else {
2229 for (i = 0; i < nb_samples; i++) {
2230 pack_float_sample(s, &samples_l[i]);
2231 pack_float_sample(s, &samples_r[i]);
2232 }
2233 }
2234}
2235
2236static void decorr_stereo_pass2(struct Decorr *dpp,
2237 int32_t *samples_l, int32_t *samples_r,
2238 int nb_samples)
2239{
2240 int i, m, k;
2241
2242 switch (dpp->value) {
2243 case 17:
2244 for (i = 0; i < nb_samples; i++) {
2245 int32_t sam, tmp;
2246
2247 sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
2248 dpp->samplesA[1] = dpp->samplesA[0];
2249 samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam);
2250 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
2251
2252 sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
2253 dpp->samplesB[1] = dpp->samplesB[0];
2254 samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam);
2255 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
2256 }
2257 break;
2258 case 18:
2259 for (i = 0; i < nb_samples; i++) {
2260 int32_t sam, tmp;
2261
2262 sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
2263 dpp->samplesA[1] = dpp->samplesA[0];
2264 samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam);
2265 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
2266
2267 sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
2268 dpp->samplesB[1] = dpp->samplesB[0];
2269 samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam);
2270 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
2271 }
2272 break;
2273 default:
2274 for (m = 0, k = dpp->value & (MAX_TERM - 1), i = 0; i < nb_samples; i++) {
2275 int32_t sam, tmp;
2276
2277 sam = dpp->samplesA[m];
2278 samples_l[i] = tmp = (dpp->samplesA[k] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam);
2279 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
2280
2281 sam = dpp->samplesB[m];
2282 samples_r[i] = tmp = (dpp->samplesB[k] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam);
2283 UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
2284
2285 m = (m + 1) & (MAX_TERM - 1);
2286 k = (k + 1) & (MAX_TERM - 1);
2287 }
2288 if (m) {
2289 int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
2290
2291 memcpy(temp_A, dpp->samplesA, sizeof (dpp->samplesA));
2292 memcpy(temp_B, dpp->samplesB, sizeof (dpp->samplesB));
2293
2294 for (k = 0; k < MAX_TERM; k++) {
2295 dpp->samplesA[k] = temp_A[m];
2296 dpp->samplesB[k] = temp_B[m];
2297 m = (m + 1) & (MAX_TERM - 1);
2298 }
2299 }
2300 break;
2301 case -1:
2302 for (i = 0; i < nb_samples; i++) {
2303 int32_t sam_A, sam_B, tmp;
2304
2305 sam_A = dpp->samplesA[0];
2306 samples_l[i] = tmp = (sam_B = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam_A);
2307 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
2308
2309 samples_r[i] = tmp = (dpp->samplesA[0] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam_B);
2310 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
2311 }
2312 break;
2313 case -2:
2314 for (i = 0; i < nb_samples; i++) {
2315 int32_t sam_A, sam_B, tmp;
2316
2317 sam_B = dpp->samplesB[0];
2318 samples_r[i] = tmp = (sam_A = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam_B);
2319 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
2320
2321 samples_l[i] = tmp = (dpp->samplesB[0] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam_A);
2322 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
2323 }
2324 break;
2325 case -3:
2326 for (i = 0; i < nb_samples; i++) {
2327 int32_t sam_A, sam_B, tmp;
2328
2329 sam_A = dpp->samplesA[0];
2330 sam_B = dpp->samplesB[0];
2331
2332 dpp->samplesA[0] = tmp = samples_r[i];
2333 samples_r[i] = tmp -= APPLY_WEIGHT(dpp->weightB, sam_B);
2334 UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
2335
2336 dpp->samplesB[0] = tmp = samples_l[i];
2337 samples_l[i] = tmp -= APPLY_WEIGHT(dpp->weightA, sam_A);
2338 UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
2339 }
2340 break;
2341 }
2342}
2343
2344#define update_weight_d2(weight, delta, source, result) \
2345 if (source && result) \
2346 weight -= (((source ^ result) >> 29) & 4) - 2;
2347
2348#define update_weight_clip_d2(weight, delta, source, result) \
2349 if (source && result) { \
2350 const int32_t s = (source ^ result) >> 31; \
2351 if ((weight = (weight ^ s) + (2 - s)) > 1024) weight = 1024; \
2352 weight = (weight ^ s) - s; \
2353 }
2354
2355static void decorr_stereo_pass_id2(struct Decorr *dpp,
2356 int32_t *samples_l, int32_t *samples_r,
2357 int nb_samples)
2358{
2359 int i, m, k;
2360
2361 switch (dpp->value) {
2362 case 17:
2363 for (i = 0; i < nb_samples; i++) {
2364 int32_t sam, tmp;
2365
2366 sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
2367 dpp->samplesA[1] = dpp->samplesA[0];
2368 samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
2369 update_weight_d2(dpp->weightA, dpp->delta, sam, tmp);
2370
2371 sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
2372 dpp->samplesB[1] = dpp->samplesB[0];
2373 samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
2374 update_weight_d2(dpp->weightB, dpp->delta, sam, tmp);
2375 }
2376 break;
2377 case 18:
2378 for (i = 0; i < nb_samples; i++) {
2379 int32_t sam, tmp;
2380
2381 sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
2382 dpp->samplesA[1] = dpp->samplesA[0];
2383 samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
2384 update_weight_d2(dpp->weightA, dpp->delta, sam, tmp);
2385
2386 sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
2387 dpp->samplesB[1] = dpp->samplesB[0];
2388 samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
2389 update_weight_d2(dpp->weightB, dpp->delta, sam, tmp);
2390 }
2391 break;
2392 default:
2393 for (m = 0, k = dpp->value & (MAX_TERM - 1), i = 0; i < nb_samples; i++) {
2394 int32_t sam, tmp;
2395
2396 sam = dpp->samplesA[m];
2397 samples_l[i] = tmp = (dpp->samplesA[k] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
2398 update_weight_d2(dpp->weightA, dpp->delta, sam, tmp);
2399
2400 sam = dpp->samplesB[m];
2401 samples_r[i] = tmp = (dpp->samplesB[k] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
2402 update_weight_d2(dpp->weightB, dpp->delta, sam, tmp);
2403
2404 m = (m + 1) & (MAX_TERM - 1);
2405 k = (k + 1) & (MAX_TERM - 1);
2406 }
2407
2408 if (m) {
2409 int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
2410
2411 memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
2412 memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
2413
2414 for (k = 0; k < MAX_TERM; k++) {
2415 dpp->samplesA[k] = temp_A[m];
2416 dpp->samplesB[k] = temp_B[m];
2417 m = (m + 1) & (MAX_TERM - 1);
2418 }
2419 }
2420 break;
2421 case -1:
2422 for (i = 0; i < nb_samples; i++) {
2423 int32_t sam_A, sam_B, tmp;
2424
2425 sam_A = dpp->samplesA[0];
2426 samples_l[i] = tmp = (sam_B = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
2427 update_weight_clip_d2(dpp->weightA, dpp->delta, sam_A, tmp);
2428
2429 samples_r[i] = tmp = (dpp->samplesA[0] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
2430 update_weight_clip_d2(dpp->weightB, dpp->delta, sam_B, tmp);
2431 }
2432 break;
2433 case -2:
2434 for (i = 0; i < nb_samples; i++) {
2435 int32_t sam_A, sam_B, tmp;
2436
2437 sam_B = dpp->samplesB[0];
2438 samples_r[i] = tmp = (sam_A = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
2439 update_weight_clip_d2(dpp->weightB, dpp->delta, sam_B, tmp);
2440
2441 samples_l[i] = tmp = (dpp->samplesB[0] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
2442 update_weight_clip_d2(dpp->weightA, dpp->delta, sam_A, tmp);
2443 }
2444 break;
2445 case -3:
2446 for (i = 0; i < nb_samples; i++) {
2447 int32_t sam_A, sam_B, tmp;
2448
2449 sam_A = dpp->samplesA[0];
2450 sam_B = dpp->samplesB[0];
2451
2452 dpp->samplesA[0] = tmp = samples_r[i];
2453 samples_r[i] = tmp -= APPLY_WEIGHT_I(dpp->weightB, sam_B);
2454 update_weight_clip_d2(dpp->weightB, dpp->delta, sam_B, tmp);
2455
2456 dpp->samplesB[0] = tmp = samples_l[i];
2457 samples_l[i] = tmp -= APPLY_WEIGHT_I(dpp->weightA, sam_A);
2458 update_weight_clip_d2(dpp->weightA, dpp->delta, sam_A, tmp);
2459 }
2460 break;
2461 }
2462}
2463
2465{
2466 if (size & 1)
2467 flags |= WP_IDF_ODD;
2468
2469 bytestream2_put_byte(pb, flags);
2470 bytestream2_put_byte(pb, (size + 1) >> 1);
2471}
2472
2474 int32_t *samples_l, int32_t *samples_r,
2475 uint8_t *out, int out_size)
2476{
2477 int block_size, start, end, data_size, tcount, temp, m = 0;
2478 int i, j, ret = 0, got_extra = 0, nb_samples = s->block_samples;
2479 uint32_t crc = 0xffffffffu;
2480 struct Decorr *dpp;
2481 PutByteContext pb;
2482
2483 if (s->flags & WV_MONO_DATA) {
2484 CLEAR(s->w);
2485 }
2486 if (!(s->flags & WV_MONO) && s->optimize_mono) {
2487 int32_t lor = 0, diff = 0;
2488
2489 for (i = 0; i < nb_samples; i++) {
2490 lor |= samples_l[i] | samples_r[i];
2491 diff |= samples_l[i] - samples_r[i];
2492
2493 if (lor && diff)
2494 break;
2495 }
2496
2497 if (i == nb_samples && lor && !diff) {
2498 s->flags &= ~(WV_JOINT_STEREO | WV_CROSS_DECORR);
2499 s->flags |= WV_FALSE_STEREO;
2500
2501 if (!s->false_stereo) {
2502 s->false_stereo = 1;
2503 s->num_terms = 0;
2504 CLEAR(s->w);
2505 }
2506 } else if (s->false_stereo) {
2507 s->false_stereo = 0;
2508 s->num_terms = 0;
2509 CLEAR(s->w);
2510 }
2511 }
2512
2513 if (s->flags & SHIFT_MASK) {
2514 int shift = (s->flags & SHIFT_MASK) >> SHIFT_LSB;
2515 int mag = (s->flags & MAG_MASK) >> MAG_LSB;
2516
2517 if (s->flags & WV_MONO_DATA)
2518 shift_mono(samples_l, nb_samples, shift);
2519 else
2520 shift_stereo(samples_l, samples_r, nb_samples, shift);
2521
2522 if ((mag -= shift) < 0)
2523 s->flags &= ~MAG_MASK;
2524 else
2525 s->flags -= (1 << MAG_LSB) * shift;
2526 }
2527
2528 if ((s->flags & WV_FLOAT_DATA) || (s->flags & MAG_MASK) >> MAG_LSB >= 24) {
2529 av_fast_padded_malloc(&s->orig_l, &s->orig_l_size, sizeof(int32_t) * nb_samples);
2530 memcpy(s->orig_l, samples_l, sizeof(int32_t) * nb_samples);
2531 if (!(s->flags & WV_MONO_DATA)) {
2532 av_fast_padded_malloc(&s->orig_r, &s->orig_r_size, sizeof(int32_t) * nb_samples);
2533 memcpy(s->orig_r, samples_r, sizeof(int32_t) * nb_samples);
2534 }
2535
2536 if (s->flags & WV_FLOAT_DATA)
2537 got_extra = scan_float(s, samples_l, samples_r, nb_samples);
2538 else
2539 got_extra = scan_int32(s, samples_l, samples_r, nb_samples);
2540 s->num_terms = 0;
2541 } else {
2542 scan_int23(s, samples_l, samples_r, nb_samples);
2543 if (s->shift != s->int32_zeros + s->int32_ones + s->int32_dups) {
2544 s->shift = s->int32_zeros + s->int32_ones + s->int32_dups;
2545 s->num_terms = 0;
2546 }
2547 }
2548
2549 if (!s->num_passes && !s->num_terms) {
2550 s->num_passes = 1;
2551
2552 if (s->flags & WV_MONO_DATA)
2553 ret = wv_mono(s, samples_l, 1, 0);
2554 else
2555 ret = wv_stereo(s, samples_l, samples_r, 1, 0);
2556
2557 s->num_passes = 0;
2558 }
2559 if (s->flags & WV_MONO_DATA) {
2560 for (i = 0; i < nb_samples; i++)
2561 crc += (crc << 1) + samples_l[i];
2562
2563 if (s->num_passes)
2564 ret = wv_mono(s, samples_l, !s->num_terms, 1);
2565 } else {
2566 for (i = 0; i < nb_samples; i++)
2567 crc += (crc << 3) + ((uint32_t)samples_l[i] << 1) + samples_l[i] + samples_r[i];
2568
2569 if (s->num_passes)
2570 ret = wv_stereo(s, samples_l, samples_r, !s->num_terms, 1);
2571 }
2572 if (ret < 0)
2573 return ret;
2574
2575 if (!s->ch_offset)
2576 s->flags |= WV_INITIAL_BLOCK;
2577
2578 s->ch_offset += 1 + !(s->flags & WV_MONO);
2579
2580 if (s->ch_offset == s->avctx->ch_layout.nb_channels)
2581 s->flags |= WV_FINAL_BLOCK;
2582
2584 bytestream2_put_le32(&pb, MKTAG('w', 'v', 'p', 'k'));
2585 bytestream2_put_le32(&pb, 0);
2586 bytestream2_put_le16(&pb, 0x410);
2587 bytestream2_put_le16(&pb, 0);
2588 bytestream2_put_le32(&pb, 0);
2589 bytestream2_put_le32(&pb, s->sample_index);
2590 bytestream2_put_le32(&pb, nb_samples);
2591 bytestream2_put_le32(&pb, s->flags);
2592 bytestream2_put_le32(&pb, crc);
2593
2594 if (s->flags & WV_INITIAL_BLOCK &&
2595 s->avctx->ch_layout.order == AV_CHANNEL_ORDER_NATIVE &&
2596 s->avctx->ch_layout.u.mask != AV_CH_LAYOUT_MONO &&
2597 s->avctx->ch_layout.u.mask != AV_CH_LAYOUT_STEREO) {
2599 bytestream2_put_byte(&pb, s->avctx->ch_layout.nb_channels);
2600 if (s->avctx->ch_layout.u.mask >> 32)
2601 bytestream2_put_le32(&pb, 0);
2602 else
2603 bytestream2_put_le32(&pb, s->avctx->ch_layout.u.mask);
2604 bytestream2_put_byte(&pb, 0);
2605 } else if (s->flags & WV_INITIAL_BLOCK &&
2606 s->avctx->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) {
2608 bytestream2_put_byte(&pb, s->avctx->ch_layout.nb_channels);
2609 bytestream2_put_le32(&pb, 0);
2610 bytestream2_put_byte(&pb, 0);
2611 }
2612
2613 if ((s->flags & SRATE_MASK) == SRATE_MASK) {
2615 bytestream2_put_le24(&pb, s->avctx->sample_rate);
2616 bytestream2_put_byte(&pb, 0);
2617 }
2618
2619 put_metadata_block(&pb, WP_ID_DECTERMS, s->num_terms);
2620 for (i = 0; i < s->num_terms; i++) {
2621 struct Decorr *dpp = &s->decorr_passes[i];
2622 bytestream2_put_byte(&pb, ((dpp->value + 5) & 0x1f) | ((dpp->delta << 5) & 0xe0));
2623 }
2624 if (s->num_terms & 1)
2625 bytestream2_put_byte(&pb, 0);
2626
2627#define WRITE_DECWEIGHT(type) do { \
2628 temp = store_weight(type); \
2629 bytestream2_put_byte(&pb, temp); \
2630 type = restore_weight(temp); \
2631 } while (0)
2632
2633 bytestream2_put_byte(&pb, WP_ID_DECWEIGHTS);
2634 bytestream2_put_byte(&pb, 0);
2635 start = bytestream2_tell_p(&pb);
2636 for (i = s->num_terms - 1; i >= 0; --i) {
2637 struct Decorr *dpp = &s->decorr_passes[i];
2638
2639 if (store_weight(dpp->weightA) ||
2640 (!(s->flags & WV_MONO_DATA) && store_weight(dpp->weightB)))
2641 break;
2642 }
2643 tcount = i + 1;
2644 for (i = 0; i < s->num_terms; i++) {
2645 struct Decorr *dpp = &s->decorr_passes[i];
2646 if (i < tcount) {
2648 if (!(s->flags & WV_MONO_DATA))
2650 } else {
2651 dpp->weightA = dpp->weightB = 0;
2652 }
2653 }
2654 end = bytestream2_tell_p(&pb);
2655 out[start - 2] = WP_ID_DECWEIGHTS | (((end - start) & 1) ? WP_IDF_ODD: 0);
2656 out[start - 1] = (end - start + 1) >> 1;
2657 if ((end - start) & 1)
2658 bytestream2_put_byte(&pb, 0);
2659
2660#define WRITE_DECSAMPLE(type) do { \
2661 temp = log2s(type); \
2662 type = wp_exp2(temp); \
2663 bytestream2_put_le16(&pb, temp); \
2664 } while (0)
2665
2666 bytestream2_put_byte(&pb, WP_ID_DECSAMPLES);
2667 bytestream2_put_byte(&pb, 0);
2668 start = bytestream2_tell_p(&pb);
2669 for (i = 0; i < s->num_terms; i++) {
2670 struct Decorr *dpp = &s->decorr_passes[i];
2671 if (i == 0) {
2672 if (dpp->value > MAX_TERM) {
2673 WRITE_DECSAMPLE(dpp->samplesA[0]);
2674 WRITE_DECSAMPLE(dpp->samplesA[1]);
2675 if (!(s->flags & WV_MONO_DATA)) {
2676 WRITE_DECSAMPLE(dpp->samplesB[0]);
2677 WRITE_DECSAMPLE(dpp->samplesB[1]);
2678 }
2679 } else if (dpp->value < 0) {
2680 WRITE_DECSAMPLE(dpp->samplesA[0]);
2681 WRITE_DECSAMPLE(dpp->samplesB[0]);
2682 } else {
2683 for (j = 0; j < dpp->value; j++) {
2684 WRITE_DECSAMPLE(dpp->samplesA[j]);
2685 if (!(s->flags & WV_MONO_DATA))
2686 WRITE_DECSAMPLE(dpp->samplesB[j]);
2687 }
2688 }
2689 } else {
2690 CLEAR(dpp->samplesA);
2691 CLEAR(dpp->samplesB);
2692 }
2693 }
2694 end = bytestream2_tell_p(&pb);
2695 out[start - 1] = (end - start) >> 1;
2696
2697#define WRITE_CHAN_ENTROPY(chan) do { \
2698 for (i = 0; i < 3; i++) { \
2699 temp = wp_log2(s->w.c[chan].median[i]); \
2700 bytestream2_put_le16(&pb, temp); \
2701 s->w.c[chan].median[i] = wp_exp2(temp); \
2702 } \
2703 } while (0)
2704
2705 put_metadata_block(&pb, WP_ID_ENTROPY, 6 * (1 + (!(s->flags & WV_MONO_DATA))));
2707 if (!(s->flags & WV_MONO_DATA))
2709
2710 if (s->flags & WV_FLOAT_DATA) {
2712 bytestream2_put_byte(&pb, s->float_flags);
2713 bytestream2_put_byte(&pb, s->float_shift);
2714 bytestream2_put_byte(&pb, s->float_max_exp);
2715 bytestream2_put_byte(&pb, 127);
2716 }
2717
2718 if (s->flags & WV_INT32_DATA) {
2720 bytestream2_put_byte(&pb, s->int32_sent_bits);
2721 bytestream2_put_byte(&pb, s->int32_zeros);
2722 bytestream2_put_byte(&pb, s->int32_ones);
2723 bytestream2_put_byte(&pb, s->int32_dups);
2724 }
2725
2726 if (s->flags & WV_MONO_DATA && !s->num_passes) {
2727 for (i = 0; i < nb_samples; i++) {
2728 int32_t code = samples_l[i];
2729
2730 for (tcount = s->num_terms, dpp = s->decorr_passes; tcount--; dpp++) {
2731 int32_t sam;
2732
2733 if (dpp->value > MAX_TERM) {
2734 if (dpp->value & 1)
2735 sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
2736 else
2737 sam = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
2738
2739 dpp->samplesA[1] = dpp->samplesA[0];
2740 dpp->samplesA[0] = code;
2741 } else {
2742 sam = dpp->samplesA[m];
2743 dpp->samplesA[(m + dpp->value) & (MAX_TERM - 1)] = code;
2744 }
2745
2746 code -= APPLY_WEIGHT(dpp->weightA, sam);
2747 UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, code);
2748 }
2749
2750 m = (m + 1) & (MAX_TERM - 1);
2751 samples_l[i] = code;
2752 }
2753 if (m) {
2754 for (tcount = s->num_terms, dpp = s->decorr_passes; tcount--; dpp++)
2755 if (dpp->value > 0 && dpp->value <= MAX_TERM) {
2756 int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
2757 int k;
2758
2759 memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
2760 memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
2761
2762 for (k = 0; k < MAX_TERM; k++) {
2763 dpp->samplesA[k] = temp_A[m];
2764 dpp->samplesB[k] = temp_B[m];
2765 m = (m + 1) & (MAX_TERM - 1);
2766 }
2767 }
2768 }
2769 } else if (!s->num_passes) {
2770 if (s->flags & WV_JOINT_STEREO) {
2771 for (i = 0; i < nb_samples; i++)
2772 samples_r[i] += ((samples_l[i] -= samples_r[i]) >> 1);
2773 }
2774
2775 for (i = 0; i < s->num_terms; i++) {
2776 struct Decorr *dpp = &s->decorr_passes[i];
2777 if (((s->flags & MAG_MASK) >> MAG_LSB) >= 16 || dpp->delta != 2)
2778 decorr_stereo_pass2(dpp, samples_l, samples_r, nb_samples);
2779 else
2780 decorr_stereo_pass_id2(dpp, samples_l, samples_r, nb_samples);
2781 }
2782 }
2783
2784 bytestream2_put_byte(&pb, WP_ID_DATA | WP_IDF_LONG);
2786 if (s->flags & WV_MONO_DATA) {
2787 for (i = 0; i < nb_samples; i++)
2788 wavpack_encode_sample(s, &s->w.c[0], s->samples[0][i]);
2789 } else {
2790 for (i = 0; i < nb_samples; i++) {
2791 wavpack_encode_sample(s, &s->w.c[0], s->samples[0][i]);
2792 wavpack_encode_sample(s, &s->w.c[1], s->samples[1][i]);
2793 }
2794 }
2795 encode_flush(s);
2796 flush_put_bits(&s->pb);
2797 data_size = put_bytes_output(&s->pb);
2798 bytestream2_put_le24(&pb, (data_size + 1) >> 1);
2799 bytestream2_skip_p(&pb, data_size);
2800 if (data_size & 1)
2801 bytestream2_put_byte(&pb, 0);
2802
2803 if (got_extra) {
2804 bytestream2_put_byte(&pb, WP_ID_EXTRABITS | WP_IDF_LONG);
2806 if (s->flags & WV_FLOAT_DATA)
2807 pack_float(s, s->orig_l, s->orig_r, nb_samples);
2808 else
2809 pack_int32(s, s->orig_l, s->orig_r, nb_samples);
2810 flush_put_bits(&s->pb);
2811 data_size = put_bytes_output(&s->pb);
2812 bytestream2_put_le24(&pb, (data_size + 5) >> 1);
2813 bytestream2_put_le32(&pb, s->crc_x);
2814 bytestream2_skip_p(&pb, data_size);
2815 if (data_size & 1)
2816 bytestream2_put_byte(&pb, 0);
2817 }
2818
2819 block_size = bytestream2_tell_p(&pb);
2820 AV_WL32(out + 4, block_size - 8);
2821
2823
2824 return block_size;
2825}
2826
2828 const int8_t *src, int32_t *dst,
2829 int nb_samples)
2830{
2831 int i;
2832
2833#define COPY_SAMPLES(type, offset, shift) do { \
2834 const type *sptr = (const type *)src; \
2835 for (i = 0; i < nb_samples; i++) \
2836 dst[i] = (sptr[i] - offset) >> shift; \
2837 } while (0)
2838
2839 switch (s->avctx->sample_fmt) {
2840 case AV_SAMPLE_FMT_U8P:
2841 COPY_SAMPLES(uint8_t, 0x80, 0);
2842 break;
2843 case AV_SAMPLE_FMT_S16P:
2844 COPY_SAMPLES(int16_t, 0, 0);
2845 break;
2846 case AV_SAMPLE_FMT_S32P:
2847 if (s->avctx->bits_per_raw_sample <= 24) {
2848 COPY_SAMPLES(int32_t, 0, 8);
2849 break;
2850 }
2852 case AV_SAMPLE_FMT_FLTP:
2853 memcpy(dst, src, nb_samples * 4);
2854 }
2855}
2856
2858{
2859 int i;
2860
2861 for (i = 0; i < 15; i++) {
2862 if (wv_rates[i] == s->avctx->sample_rate)
2863 break;
2864 }
2865
2866 s->flags = i << SRATE_LSB;
2867}
2868
2870 const AVFrame *frame, int *got_packet_ptr)
2871{
2873 int buf_size, ret;
2874 uint8_t *buf;
2875
2876 s->block_samples = frame->nb_samples;
2877 av_fast_padded_malloc(&s->samples[0], &s->samples_size[0],
2878 sizeof(int32_t) * s->block_samples);
2879 if (!s->samples[0])
2880 return AVERROR(ENOMEM);
2881 if (avctx->ch_layout.nb_channels > 1) {
2882 av_fast_padded_malloc(&s->samples[1], &s->samples_size[1],
2883 sizeof(int32_t) * s->block_samples);
2884 if (!s->samples[1])
2885 return AVERROR(ENOMEM);
2886 }
2887
2888 buf_size = s->block_samples * avctx->ch_layout.nb_channels * 8
2889 + 200 * avctx->ch_layout.nb_channels /* for headers */;
2890 if ((ret = ff_alloc_packet(avctx, avpkt, buf_size)) < 0)
2891 return ret;
2892 buf = avpkt->data;
2893
2894 for (s->ch_offset = 0; s->ch_offset < avctx->ch_layout.nb_channels;) {
2896
2897 switch (s->avctx->sample_fmt) {
2898 case AV_SAMPLE_FMT_S16P: s->flags |= 1; break;
2899 case AV_SAMPLE_FMT_S32P: s->flags |= 3 - (s->avctx->bits_per_raw_sample <= 24); break;
2900 case AV_SAMPLE_FMT_FLTP: s->flags |= 3 | WV_FLOAT_DATA;
2901 }
2902
2903 fill_buffer(s, frame->extended_data[s->ch_offset], s->samples[0], s->block_samples);
2904 if (avctx->ch_layout.nb_channels - s->ch_offset == 1) {
2905 s->flags |= WV_MONO;
2906 } else {
2907 s->flags |= WV_CROSS_DECORR;
2908 fill_buffer(s, frame->extended_data[s->ch_offset + 1], s->samples[1], s->block_samples);
2909 }
2910
2911 s->flags += (1 << MAG_LSB) * ((s->flags & 3) * 8 + 7);
2912
2913 if ((ret = wavpack_encode_block(s, s->samples[0], s->samples[1],
2914 buf, buf_size)) < 0)
2915 return ret;
2916
2917 buf += ret;
2918 buf_size -= ret;
2919 }
2920 s->sample_index += frame->nb_samples;
2921
2922 avpkt->size = buf - avpkt->data;
2923 *got_packet_ptr = 1;
2924 return 0;
2925}
2926
2928{
2930 int i;
2931
2932 for (i = 0; i < MAX_TERMS + 2; i++) {
2933 av_freep(&s->sampleptrs[i][0]);
2934 av_freep(&s->sampleptrs[i][1]);
2935 s->sampleptrs_size[i][0] = s->sampleptrs_size[i][1] = 0;
2936 }
2937
2938 for (i = 0; i < 2; i++) {
2939 av_freep(&s->samples[i]);
2940 s->samples_size[i] = 0;
2941
2942 av_freep(&s->best_buffer[i]);
2943 s->best_buffer_size[i] = 0;
2944
2945 av_freep(&s->temp_buffer[i][0]);
2946 av_freep(&s->temp_buffer[i][1]);
2947 s->temp_buffer_size[i][0] = s->temp_buffer_size[i][1] = 0;
2948 }
2949
2950 av_freep(&s->js_left);
2951 av_freep(&s->js_right);
2952 s->js_left_size = s->js_right_size = 0;
2953
2954 av_freep(&s->orig_l);
2955 av_freep(&s->orig_r);
2956 s->orig_l_size = s->orig_r_size = 0;
2957
2958 return 0;
2959}
2960
2961#define OFFSET(x) offsetof(WavPackEncodeContext, x)
2962#define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
2963static const AVOption options[] = {
2964 { "joint_stereo", "", OFFSET(joint), AV_OPT_TYPE_BOOL, {.i64=-1}, -1, 1, FLAGS },
2965 { "optimize_mono", "", OFFSET(optimize_mono), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
2966 { NULL },
2967};
2968
2970 .class_name = "WavPack encoder",
2971 .item_name = av_default_item_name,
2972 .option = options,
2973 .version = LIBAVUTIL_VERSION_INT,
2974};
2975
2977 .p.name = "wavpack",
2978 CODEC_LONG_NAME("WavPack"),
2979 .p.type = AVMEDIA_TYPE_AUDIO,
2980 .p.id = AV_CODEC_ID_WAVPACK,
2983 .priv_data_size = sizeof(WavPackEncodeContext),
2984 .p.priv_class = &wavpack_encoder_class,
2985 .init = wavpack_encode_init,
2987 .close = wavpack_encode_close,
2990};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
const FFCodec ff_wavpack_encoder
static FILE * out
static int out_size
#define L(x)
Definition vpx_arith.h:36
int32_t
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define FF_COMPRESSION_DEFAULT
Definition avcodec.h:1242
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
Definition bytestream.h:197
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
Definition bytestream.h:147
static av_always_inline void bytestream2_skip_p(PutByteContext *p, unsigned int size)
Definition bytestream.h:180
static av_always_inline int bytestream2_get_bytes_left_p(const PutByteContext *p)
Definition bytestream.h:163
static av_always_inline unsigned int bytestream2_get_eof(PutByteContext *p)
Definition bytestream.h:332
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
#define s(width, name)
Definition cbs_vp9.c:198
Public libavutil channel layout APIs header.
#define FLAGS
Definition cmdutils.c:598
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define CODEC_SAMPLEFMTS(...)
#define FFABSU(a)
Unsigned Absolute value.
Definition common.h:91
#define av_clip
Definition common.h:100
#define NULL
Definition coverity.c:32
static __device__ float floor(float a)
static AVFrame * frame
int high
Definition dovi_rpuenc.c:39
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition encode.c:62
double value
Definition eval.c:102
#define M(chr)
Definition exr.c:177
static const uint8_t bits[8]
Definition fastaudio.c:100
#define sample
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
#define AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_STEREO
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition codec.h:147
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
Definition codec.h:84
@ AV_CODEC_ID_WAVPACK
Definition codec_id.h:478
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition utils.c:53
@ AV_CHANNEL_ORDER_NATIVE
The native channel order, i.e.
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition samplefmt.h:66
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
Definition samplefmt.h:64
@ AV_SAMPLE_FMT_U8P
unsigned 8 bits, planar
Definition samplefmt.h:63
@ AV_SAMPLE_FMT_S32P
signed 32 bits, planar
Definition samplefmt.h:65
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
#define R
Definition huffyuv.h:44
#define AV_WL32(p, v)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition j2kenc.c:154
static int shift(int a, int b)
Definition bonk.c:261
Macro definitions for various function/variable attributes.
#define av_fallthrough
Definition attributes.h:67
#define av_cold
Definition attributes.h:117
uint8_t w
Definition llvidencdsp.c:39
static const uint16_t mask[17]
Definition lzw.c:38
#define FFMIN(a, b)
Definition macros.h:49
#define MKTAG(a, b, c, d)
Definition macros.h:55
Memory handling functions.
AVOptions.
bitstream writer API
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition put_bits.h:291
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition put_bits.h:62
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition put_bits.h:153
static int put_bytes_output(const PutBitContext *s)
Definition put_bits.h:99
const h264_weight_func weight
const uint8_t * code
Definition spdifenc.c:433
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
int sample_rate
samples per second
Definition avcodec.h:1040
int compression_level
Definition avcodec.h:1241
int frame_size
Number of samples per channel in an audio frame.
Definition avcodec.h:1068
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
int sumB
Definition wavpack.h:97
int samplesB[MAX_TERM]
Definition wavpack.h:95
int sumA
Definition wavpack.h:96
int value
Definition wavpack.h:91
int samplesA[MAX_TERM]
Definition wavpack.h:94
int delta
Definition wavpack.h:90
int weightA
Definition wavpack.h:92
int weightB
Definition wavpack.h:93
uint8_t * buffer
Definition bytestream.h:38
int8_t terms[MAX_TERMS+1]
Definition wavpackenc.h:29
int32_t * sampleptrs[MAX_TERMS+2][2]
Definition wavpackenc.c:92
int temp_buffer_size[2][2]
Definition wavpackenc.c:96
PutBitContext pb
Definition wavpackenc.c:82
int32_t * temp_buffer[2][2]
Definition wavpackenc.c:95
struct Decorr decorr_passes[MAX_TERMS]
Definition wavpackenc.c:124
int sampleptrs_size[MAX_TERMS+2][2]
Definition wavpackenc.c:93
const WavPackDecorrSpec * decorr_specs
Definition wavpackenc.c:125
int32_t * best_buffer[2]
Definition wavpackenc.c:98
int32_t * samples[2]
Definition wavpackenc.c:89
AVCodecContext * avctx
Definition wavpackenc.c:81
uint32_t best_bits
Definition wavpackenc.c:70
struct Decorr dps[MAX_TERMS]
Definition wavpackenc.c:68
WvChannel c[2]
Definition wavpackenc.c:76
#define av_freep(p)
#define av_log(a,...)
static uint8_t tmp[40]
Definition aes_ctr.c:52
#define src
Definition vp8dsp.c:248
int size
else temp
Definition vf_mcdeint.c:275
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static double limit(double x)
float delta
static double c[64]
static av_always_inline int wp_exp2(int16_t val)
Definition wavpack.h:134
#define WV_FINAL_BLOCK
Definition wavpack.h:48
#define MAX_TERMS
Definition wavpack.h:30
#define WV_CROSS_DECORR
Definition wavpack.h:37
#define WV_MONO
Definition wavpack.h:35
@ WP_ID_DECTERMS
Definition wavpack.h:73
@ WP_ID_DECSAMPLES
Definition wavpack.h:75
@ WP_ID_EXTRABITS
Definition wavpack.h:83
@ WP_ID_INT32INFO
Definition wavpack.h:80
@ WP_ID_SAMPLE_RATE
Definition wavpack.h:86
@ WP_ID_ENTROPY
Definition wavpack.h:76
@ WP_ID_DATA
Definition wavpack.h:81
@ WP_ID_CHANINFO
Definition wavpack.h:84
@ WP_ID_DECWEIGHTS
Definition wavpack.h:74
@ WP_ID_FLOATINFO
Definition wavpack.h:79
#define WV_MONO_DATA
Definition wavpack.h:50
const uint8_t ff_wp_log2_table[256]
Definition wavpackdata.c:43
#define INC_MED(n)
Definition wavpack.h:109
#define MAX_TERM
Definition wavpack.h:31
@ WP_IDF_ODD
Definition wavpack.h:66
@ WP_IDF_LONG
Definition wavpack.h:67
static const int wv_rates[16]
Definition wavpack.h:125
#define WV_FLOAT_DATA
Definition wavpack.h:38
#define DEC_MED(n)
Definition wavpack.h:108
#define WV_MAX_SAMPLES
Definition wavpack.h:61
#define GET_MED(n)
Definition wavpack.h:107
#define WV_JOINT_STEREO
Definition wavpack.h:36
#define WV_INT32_DATA
Definition wavpack.h:39
static av_always_inline int wp_log2(uint32_t val)
Definition wavpack.h:151
#define WV_INITIAL_BLOCK
Definition wavpack.h:47
#define WV_FALSE_STEREO
Definition wavpack.h:40
#define UPDATE_WEIGHT_CLIP(weight, delta, samples, in)
Definition wavpack.h:112
static void decorr_stereo(int32_t *in_left, int32_t *in_right, int32_t *out_left, int32_t *out_right, int nb_samples, struct Decorr *dpp, int dir)
#define SHIFT_LSB
Definition wavpackenc.c:52
static void recurse_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info, int depth, int delta, uint32_t input_bits)
static void process_float(WavPackEncodeContext *s, int32_t *sample)
Definition wavpackenc.c:227
#define SRATE_MASK
Definition wavpackenc.c:59
static av_cold int wavpack_encode_close(AVCodecContext *avctx)
#define EXTRA_TRY_DELTAS
Definition wavpackenc.c:61
static void analyze_mono(WavPackEncodeContext *s, int32_t *samples, int do_samples)
Definition wavpackenc.c:939
#define get_mantissa(f)
Definition wavpackenc.c:223
static void encode_flush(WavPackEncodeContext *s)
#define MAG_LSB
Definition wavpackenc.c:55
#define update_weight_clip_d2(weight, delta, source, result)
static int scan_int32(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
Definition wavpackenc.c:435
#define FLOAT_NEG_ZEROS
Definition wavpackenc.c:220
static const AVClass wavpack_encoder_class
#define EXTRA_ADJUST_DELTAS
Definition wavpackenc.c:62
static void decorr_stereo_pass2(struct Decorr *dpp, int32_t *samples_l, int32_t *samples_r, int nb_samples)
#define FLOAT_ZEROS_SENT
Definition wavpackenc.c:219
#define SHIFT_MASK
Definition wavpackenc.c:53
static uint32_t log2sample(uint32_t v, int limit, uint32_t *result)
Definition wavpackenc.c:646
static void reverse_decorr(struct Decorr *dpp)
static void pack_int32(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
#define count_bits(av)
Definition wavpackenc.c:644
static void wavpack_encode_sample(WavPackEncodeContext *s, WvChannel *c, int32_t sample)
#define FLOAT_SHIFT_ONES
Definition wavpackenc.c:216
static uint32_t log2stereo(int32_t *samples_l, int32_t *samples_r, int nb_samples, int limit)
Definition wavpackenc.c:673
static void sort_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info)
static void sort_mono(WavPackEncodeContext *s, WavPackExtraInfo *info)
Definition wavpackenc.c:789
static void scan_word(WavPackEncodeContext *s, WvChannel *c, int32_t *samples, int nb_samples, int dir)
Definition wavpackenc.c:991
#define COPY_SAMPLES(type, offset, shift)
static int wv_mono(WavPackEncodeContext *s, int32_t *samples, int no_history, int do_samples)
#define UPDATE_WEIGHT(weight, delta, source, result)
Definition wavpackenc.c:36
static void put_metadata_block(PutByteContext *pb, int flags, int size)
static void decorr_stereo_buffer(WavPackExtraInfo *info, int32_t *in_left, int32_t *in_right, int32_t *out_left, int32_t *out_right, int nb_samples, int tindex)
static int8_t store_weight(int weight)
Definition wavpackenc.c:525
static void fill_buffer(WavPackEncodeContext *s, const int8_t *src, int32_t *dst, int nb_samples)
static void pack_float(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
#define update_weight_d2(weight, delta, source, result)
#define FLOAT_SHIFT_SAME
Definition wavpackenc.c:217
static uint32_t log2mono(int32_t *samples, int nb_samples, int limit)
Definition wavpackenc.c:662
static void recurse_mono(WavPackEncodeContext *s, WavPackExtraInfo *info, int depth, int delta, uint32_t input_bits)
Definition wavpackenc.c:726
static void scan_int23(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
Definition wavpackenc.c:354
static int allocate_buffers2(WavPackEncodeContext *s, int nterms)
Definition wavpackenc.c:889
static void shift_stereo(int32_t *left, int32_t *right, int nb_samples, int shift)
Definition wavpackenc.c:206
static int restore_weight(int8_t weight)
Definition wavpackenc.c:534
static void set_samplerate(WavPackEncodeContext *s)
static int allocate_buffers(WavPackEncodeContext *s)
Definition wavpackenc.c:909
static av_cold int wavpack_encode_init(AVCodecContext *avctx)
Definition wavpackenc.c:129
#define CLEAR(destin)
Definition wavpackenc.c:50
static int wavpack_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
#define WRITE_CHAN_ENTROPY(chan)
static void decorr_stereo_quick(int32_t *in_left, int32_t *in_right, int32_t *out_left, int32_t *out_right, int nb_samples, struct Decorr *dpp)
static void delta_mono(WavPackEncodeContext *s, WavPackExtraInfo *info)
Definition wavpackenc.c:836
static void reverse_mono_decorr(struct Decorr *dpp)
Definition wavpackenc.c:612
#define WRITE_DECSAMPLE(type)
#define APPLY_WEIGHT_I(weight, sample)
Definition wavpackenc.c:45
#define EXTRA_SORT_FIRST
Definition wavpackenc.c:63
#define get_sign(f)
Definition wavpackenc.c:225
static int scan_float(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
Definition wavpackenc.c:268
static int log2s(int32_t value)
Definition wavpackenc.c:544
static void shift_mono(int32_t *samples, int nb_samples, int shift)
Definition wavpackenc.c:199
#define FLOAT_EXCEPTIONS
Definition wavpackenc.c:221
static void delta_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info)
#define EXTRA_SORT_LAST
Definition wavpackenc.c:65
#define MAG_MASK
Definition wavpackenc.c:56
static void decorr_mono_buffer(int32_t *samples, int32_t *outsamples, int nb_samples, struct Decorr *dpp, int tindex)
Definition wavpackenc.c:687
static int wavpack_encode_block(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, uint8_t *out, int out_size)
#define OFFSET(x)
#define SRATE_LSB
Definition wavpackenc.c:58
static void decorr_mono(int32_t *in_samples, int32_t *out_samples, int nb_samples, struct Decorr *dpp, int dir)
Definition wavpackenc.c:549
#define WRITE_DECWEIGHT(type)
static void pack_float_sample(WavPackEncodeContext *s, int32_t *sample)
#define APPLY_WEIGHT(weight, sample)
Definition wavpackenc.c:47
#define FLOAT_SHIFT_SENT
Definition wavpackenc.c:218
#define get_exponent(f)
Definition wavpackenc.c:224
static void analyze_stereo(WavPackEncodeContext *s, int32_t *in_left, int32_t *in_right, int do_samples)
#define EXTRA_BRANCHES
Definition wavpackenc.c:64
static int wv_stereo(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int no_history, int do_samples)
static void decorr_stereo_pass_id2(struct Decorr *dpp, int32_t *samples_l, int32_t *samples_r, int nb_samples)
static const uint8_t decorr_filter_nterms[]
Definition wavpackenc.h:653
static const WavPackDecorrSpec *const decorr_filters[]
Definition wavpackenc.h:642
static const uint16_t decorr_filter_sizes[]
Definition wavpackenc.h:646