2 * WavPack lossless audio encoder
4 * This file is part of FFmpeg.
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.
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.
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
21 #define BITSTREAM_WRITER_LE
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/intreadwrite.h"
25 #include "libavutil/mem.h"
26 #include "libavutil/opt.h"
28 #include "codec_internal.h"
31 #include "bytestream.h"
32 #include "wavpackenc.h"
35 #define UPDATE_WEIGHT(weight, delta, source, result) \
36 if ((source) && (result)) { \
37 int32_t s = (int32_t) ((source) ^ (result)) >> 31; \
38 weight = ((delta) ^ s) + ((weight) - s); \
41 #define APPLY_WEIGHT_F(weight, sample) ((((((sample) & 0xffff) * (weight)) >> 9) + \
42 ((((sample) & ~0xffff) >> 9) * (weight)) + 1) >> 1)
44 #define APPLY_WEIGHT_I(weight, sample) (((weight) * (sample) + 512) >> 10)
46 #define APPLY_WEIGHT(weight, sample) ((sample) != (short) (sample) ? \
47 APPLY_WEIGHT_F(weight, sample) : APPLY_WEIGHT_I (weight, sample))
49 #define CLEAR(destin) memset(&destin, 0, sizeof(destin));
52 #define SHIFT_MASK (0x1FU << SHIFT_LSB)
55 #define MAG_MASK (0x1FU << MAG_LSB)
58 #define SRATE_MASK (0xFU << SRATE_LSB)
60 #define EXTRA_TRY_DELTAS 1
61 #define EXTRA_ADJUST_DELTAS 2
62 #define EXTRA_SORT_FIRST 4
63 #define EXTRA_BRANCHES 8
64 #define EXTRA_SORT_LAST 16
66 typedef struct WavPackExtraInfo
{
67 struct Decorr dps
[MAX_TERMS
];
68 int nterms
, log_limit
, gt16bit
;
72 typedef struct WavPackWords
{
73 int pend_data
, holding_one
, zeros_acc
;
74 int holding_zero
, pend_count
;
78 typedef struct WavPackEncodeContext
{
80 AVCodecContext
*avctx
;
85 int stereo
, stereo_in
;
91 int32_t *sampleptrs
[MAX_TERMS
+2][2];
92 int sampleptrs_size
[MAX_TERMS
+2][2];
94 int32_t *temp_buffer
[2][2];
95 int temp_buffer_size
[2][2];
97 int32_t *best_buffer
[2];
98 int best_buffer_size
[2];
100 int32_t *js_left
, *js_right
;
101 int js_left_size
, js_right_size
;
103 int32_t *orig_l
, *orig_r
;
104 int orig_l_size
, orig_r_size
;
106 unsigned extra_flags
;
116 uint8_t int32_sent_bits
, int32_zeros
, int32_ones
, int32_dups
;
117 uint8_t float_flags
, float_shift
, float_max_exp
, max_exp
;
118 int32_t shifted_ones
, shifted_zeros
, shifted_both
;
119 int32_t false_zeros
, neg_zeros
, ordata
;
121 int num_terms
, shift
, joint_stereo
, false_stereo
;
122 int num_decorrs
, num_passes
, best_decorr
, mask_decorr
;
123 struct Decorr decorr_passes
[MAX_TERMS
];
124 const WavPackDecorrSpec
*decorr_specs
;
126 } WavPackEncodeContext
;
128 static av_cold
int wavpack_encode_init(AVCodecContext
*avctx
)
130 WavPackEncodeContext
*s
= avctx
->priv_data
;
134 if (avctx
->ch_layout
.nb_channels
> 255) {
135 av_log(avctx
, AV_LOG_ERROR
, "Invalid channel count: %d\n", avctx
->ch_layout
.nb_channels
);
136 return AVERROR(EINVAL
);
139 if (!avctx
->frame_size
) {
141 if (!(avctx
->sample_rate
& 1))
142 block_samples
= avctx
->sample_rate
/ 2;
144 block_samples
= avctx
->sample_rate
;
146 while (block_samples
* avctx
->ch_layout
.nb_channels
> WV_MAX_SAMPLES
)
149 while (block_samples
* avctx
->ch_layout
.nb_channels
< 40000)
151 avctx
->frame_size
= block_samples
;
152 } else if (avctx
->frame_size
&& (avctx
->frame_size
< 128 ||
153 avctx
->frame_size
> WV_MAX_SAMPLES
)) {
154 av_log(avctx
, AV_LOG_ERROR
, "invalid block size: %d\n", avctx
->frame_size
);
155 return AVERROR(EINVAL
);
158 if (avctx
->compression_level
!= FF_COMPRESSION_DEFAULT
) {
159 if (avctx
->compression_level
>= 3) {
160 s
->decorr_filter
= 3;
162 if (avctx
->compression_level
>= 8) {
164 s
->extra_flags
= EXTRA_TRY_DELTAS
|EXTRA_ADJUST_DELTAS
|EXTRA_SORT_FIRST
|EXTRA_SORT_LAST
|EXTRA_BRANCHES
;
165 } else if (avctx
->compression_level
>= 7) {
167 s
->extra_flags
= EXTRA_TRY_DELTAS
|EXTRA_ADJUST_DELTAS
|EXTRA_SORT_FIRST
|EXTRA_BRANCHES
;
168 } else if (avctx
->compression_level
>= 6) {
170 s
->extra_flags
= EXTRA_TRY_DELTAS
|EXTRA_ADJUST_DELTAS
|EXTRA_SORT_FIRST
|EXTRA_BRANCHES
;
171 } else if (avctx
->compression_level
>= 5) {
173 s
->extra_flags
= EXTRA_TRY_DELTAS
|EXTRA_ADJUST_DELTAS
|EXTRA_SORT_FIRST
|EXTRA_BRANCHES
;
174 } else if (avctx
->compression_level
>= 4) {
176 s
->extra_flags
= EXTRA_TRY_DELTAS
|EXTRA_ADJUST_DELTAS
|EXTRA_BRANCHES
;
178 } else if (avctx
->compression_level
== 2) {
179 s
->decorr_filter
= 2;
181 } else if (avctx
->compression_level
== 1) {
182 s
->decorr_filter
= 1;
184 } else if (avctx
->compression_level
< 1) {
185 s
->decorr_filter
= 0;
190 s
->num_decorrs
= decorr_filter_sizes
[s
->decorr_filter
];
191 s
->decorr_specs
= decorr_filters
[s
->decorr_filter
];
193 s
->delta_decay
= 2.0;
198 static void shift_mono(int32_t *samples
, int nb_samples
, int shift
)
201 for (i
= 0; i
< nb_samples
; i
++)
202 samples
[i
] >>= shift
;
205 static void shift_stereo(int32_t *left
, int32_t *right
,
206 int nb_samples
, int shift
)
209 for (i
= 0; i
< nb_samples
; i
++) {
215 #define FLOAT_SHIFT_ONES 1
216 #define FLOAT_SHIFT_SAME 2
217 #define FLOAT_SHIFT_SENT 4
218 #define FLOAT_ZEROS_SENT 8
219 #define FLOAT_NEG_ZEROS 0x10
220 #define FLOAT_EXCEPTIONS 0x20
222 #define get_mantissa(f) ((f) & 0x7fffff)
223 #define get_exponent(f) (((f) >> 23) & 0xff)
224 #define get_sign(f) (((f) >> 31) & 0x1)
226 static void process_float(WavPackEncodeContext
*s
, int32_t *sample
)
228 int32_t shift_count
, value
, f
= *sample
;
230 if (get_exponent(f
) == 255) {
231 s
->float_flags
|= FLOAT_EXCEPTIONS
;
234 } else if (get_exponent(f
)) {
235 shift_count
= s
->max_exp
- get_exponent(f
);
236 value
= 0x800000 + get_mantissa(f
);
238 shift_count
= s
->max_exp
? s
->max_exp
- 1 : 0;
239 value
= get_mantissa(f
);
242 if (shift_count
< 25)
243 value
>>= shift_count
;
248 if (get_exponent(f
) || get_mantissa(f
))
250 else if (get_sign(f
))
252 } else if (shift_count
) {
253 int32_t mask
= (1 << shift_count
) - 1;
255 if (!(get_mantissa(f
) & mask
))
257 else if ((get_mantissa(f
) & mask
) == mask
)
264 *sample
= get_sign(f
) ? -value
: value
;
267 static int scan_float(WavPackEncodeContext
*s
,
268 int32_t *samples_l
, int32_t *samples_r
,
271 uint32_t crc
= 0xffffffffu
;
274 s
->shifted_ones
= s
->shifted_zeros
= s
->shifted_both
= s
->ordata
= 0;
275 s
->float_shift
= s
->float_flags
= 0;
276 s
->false_zeros
= s
->neg_zeros
= 0;
279 if (s
->flags
& WV_MONO_DATA
) {
280 for (i
= 0; i
< nb_samples
; i
++) {
281 int32_t f
= samples_l
[i
];
282 crc
= crc
* 27 + get_mantissa(f
) * 9 + get_exponent(f
) * 3 + get_sign(f
);
284 if (get_exponent(f
) > s
->max_exp
&& get_exponent(f
) < 255)
285 s
->max_exp
= get_exponent(f
);
288 for (i
= 0; i
< nb_samples
; i
++) {
292 crc
= crc
* 27 + get_mantissa(f
) * 9 + get_exponent(f
) * 3 + get_sign(f
);
293 if (get_exponent(f
) > s
->max_exp
&& get_exponent(f
) < 255)
294 s
->max_exp
= get_exponent(f
);
297 crc
= crc
* 27 + get_mantissa(f
) * 9 + get_exponent(f
) * 3 + get_sign(f
);
299 if (get_exponent(f
) > s
->max_exp
&& get_exponent(f
) < 255)
300 s
->max_exp
= get_exponent(f
);
306 if (s
->flags
& WV_MONO_DATA
) {
307 for (i
= 0; i
< nb_samples
; i
++)
308 process_float(s
, &samples_l
[i
]);
310 for (i
= 0; i
< nb_samples
; i
++) {
311 process_float(s
, &samples_l
[i
]);
312 process_float(s
, &samples_r
[i
]);
316 s
->float_max_exp
= s
->max_exp
;
319 s
->float_flags
|= FLOAT_SHIFT_SENT
;
320 else if (s
->shifted_ones
&& !s
->shifted_zeros
)
321 s
->float_flags
|= FLOAT_SHIFT_ONES
;
322 else if (s
->shifted_ones
&& s
->shifted_zeros
)
323 s
->float_flags
|= FLOAT_SHIFT_SAME
;
324 else if (s
->ordata
&& !(s
->ordata
& 1)) {
328 } while (!(s
->ordata
& 1));
330 if (s
->flags
& WV_MONO_DATA
)
331 shift_mono(samples_l
, nb_samples
, s
->float_shift
);
333 shift_stereo(samples_l
, samples_r
, nb_samples
, s
->float_shift
);
336 s
->flags
&= ~MAG_MASK
;
339 s
->flags
+= 1 << MAG_LSB
;
343 if (s
->false_zeros
|| s
->neg_zeros
)
344 s
->float_flags
|= FLOAT_ZEROS_SENT
;
347 s
->float_flags
|= FLOAT_NEG_ZEROS
;
349 return s
->float_flags
& (FLOAT_EXCEPTIONS
| FLOAT_ZEROS_SENT
|
350 FLOAT_SHIFT_SENT
| FLOAT_SHIFT_SAME
);
353 static void scan_int23(WavPackEncodeContext
*s
,
354 int32_t *samples_l
, int32_t *samples_r
,
357 uint32_t magdata
= 0, ordata
= 0, xordata
= 0, anddata
= ~0;
358 int i
, total_shift
= 0;
360 s
->int32_sent_bits
= s
->int32_zeros
= s
->int32_ones
= s
->int32_dups
= 0;
362 if (s
->flags
& WV_MONO_DATA
) {
363 for (i
= 0; i
< nb_samples
; i
++) {
364 int32_t M
= samples_l
[i
];
366 magdata
|= (M
< 0) ? ~M
: M
;
367 xordata
|= M
^ -(M
& 1);
371 if ((ordata
& 1) && !(anddata
& 1) && (xordata
& 2))
375 for (i
= 0; i
< nb_samples
; i
++) {
376 int32_t L
= samples_l
[i
];
377 int32_t R
= samples_r
[i
];
379 magdata
|= (L
< 0) ? ~L
: L
;
380 magdata
|= (R
< 0) ? ~R
: R
;
381 xordata
|= L
^ -(L
& 1);
382 xordata
|= R
^ -(R
& 1);
386 if ((ordata
& 1) && !(anddata
& 1) && (xordata
& 2))
391 s
->flags
&= ~MAG_MASK
;
394 s
->flags
+= 1 << MAG_LSB
;
398 if (!(s
->flags
& MAG_MASK
))
403 s
->flags
-= 1 << MAG_LSB
;
407 } while (!(ordata
& 1));
408 } else if (anddata
& 1) {
410 s
->flags
-= 1 << MAG_LSB
;
414 } while (anddata
& 1);
415 } else if (!(xordata
& 2)) {
417 s
->flags
-= 1 << MAG_LSB
;
421 } while (!(xordata
& 2));
425 s
->flags
|= WV_INT32_DATA
;
427 if (s
->flags
& WV_MONO_DATA
)
428 shift_mono(samples_l
, nb_samples
, total_shift
);
430 shift_stereo(samples_l
, samples_r
, nb_samples
, total_shift
);
434 static int scan_int32(WavPackEncodeContext
*s
,
435 int32_t *samples_l
, int32_t *samples_r
,
438 uint32_t magdata
= 0, ordata
= 0, xordata
= 0, anddata
= ~0;
439 uint32_t crc
= 0xffffffffu
;
440 int i
, total_shift
= 0;
442 s
->int32_sent_bits
= s
->int32_zeros
= s
->int32_ones
= s
->int32_dups
= 0;
444 if (s
->flags
& WV_MONO_DATA
) {
445 for (i
= 0; i
< nb_samples
; i
++) {
446 int32_t M
= samples_l
[i
];
448 crc
= crc
* 9 + (M
& 0xffff) * 3 + ((M
>> 16) & 0xffff);
449 magdata
|= (M
< 0) ? ~M
: M
;
450 xordata
|= M
^ -(M
& 1);
455 for (i
= 0; i
< nb_samples
; i
++) {
456 int32_t L
= samples_l
[i
];
457 int32_t R
= samples_r
[i
];
459 crc
= crc
* 9 + (L
& 0xffff) * 3 + ((L
>> 16) & 0xffff);
460 crc
= crc
* 9 + (R
& 0xffff) * 3 + ((R
>> 16) & 0xffff);
461 magdata
|= (L
< 0) ? ~L
: L
;
462 magdata
|= (R
< 0) ? ~R
: R
;
463 xordata
|= L
^ -(L
& 1);
464 xordata
|= R
^ -(R
& 1);
471 s
->flags
&= ~MAG_MASK
;
474 s
->flags
+= 1 << MAG_LSB
;
478 if (!((s
->flags
& MAG_MASK
) >> MAG_LSB
)) {
479 s
->flags
&= ~WV_INT32_DATA
;
485 s
->flags
-= 1 << MAG_LSB
;
489 } while (!(ordata
& 1));
490 else if (anddata
& 1)
492 s
->flags
-= 1 << MAG_LSB
;
496 } while (anddata
& 1);
497 else if (!(xordata
& 2))
499 s
->flags
-= 1 << MAG_LSB
;
503 } while (!(xordata
& 2));
505 if (((s
->flags
& MAG_MASK
) >> MAG_LSB
) > 23) {
506 s
->int32_sent_bits
= (uint8_t)(((s
->flags
& MAG_MASK
) >> MAG_LSB
) - 23);
507 total_shift
+= s
->int32_sent_bits
;
508 s
->flags
&= ~MAG_MASK
;
509 s
->flags
+= 23 << MAG_LSB
;
513 s
->flags
|= WV_INT32_DATA
;
515 if (s
->flags
& WV_MONO_DATA
)
516 shift_mono(samples_l
, nb_samples
, total_shift
);
518 shift_stereo(samples_l
, samples_r
, nb_samples
, total_shift
);
521 return s
->int32_sent_bits
;
524 static int8_t store_weight(int weight
)
526 weight
= av_clip(weight
, -1024, 1024);
528 weight
-= (weight
+ 64) >> 7;
530 return (weight
+ 4) >> 3;
533 static int restore_weight(int8_t weight
)
535 int result
= 8 * weight
;
538 result
+= (result
+ 64) >> 7;
543 static int log2s(int32_t value
)
545 return (value
< 0) ? -wp_log2(-value
) : wp_log2(value
);
548 static void decorr_mono(int32_t *in_samples
, int32_t *out_samples
,
549 int nb_samples
, struct Decorr
*dpp
, int dir
)
556 out_samples
+= (nb_samples
- 1);
557 in_samples
+= (nb_samples
- 1);
560 dpp
->weightA
= restore_weight(store_weight(dpp
->weightA
));
562 for (i
= 0; i
< MAX_TERM
; i
++)
563 dpp
->samplesA
[i
] = wp_exp2(log2s(dpp
->samplesA
[i
]));
565 if (dpp
->value
> MAX_TERM
) {
566 while (nb_samples
--) {
569 sam_A
= ((3 - (dpp
->value
& 1)) * dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> !(dpp
->value
& 1);
571 dpp
->samplesA
[1] = dpp
->samplesA
[0];
572 dpp
->samplesA
[0] = left
= in_samples
[0];
574 left
-= APPLY_WEIGHT(dpp
->weightA
, sam_A
);
575 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam_A
, left
);
576 dpp
->sumA
+= dpp
->weightA
;
577 out_samples
[0] = left
;
581 } else if (dpp
->value
> 0) {
582 while (nb_samples
--) {
583 int k
= (m
+ dpp
->value
) & (MAX_TERM
- 1);
586 sam_A
= dpp
->samplesA
[m
];
587 dpp
->samplesA
[k
] = left
= in_samples
[0];
588 m
= (m
+ 1) & (MAX_TERM
- 1);
590 left
-= APPLY_WEIGHT(dpp
->weightA
, sam_A
);
591 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam_A
, left
);
592 dpp
->sumA
+= dpp
->weightA
;
593 out_samples
[0] = left
;
599 if (m
&& dpp
->value
> 0 && dpp
->value
<= MAX_TERM
) {
600 int32_t temp_A
[MAX_TERM
];
602 memcpy(temp_A
, dpp
->samplesA
, sizeof(dpp
->samplesA
));
604 for (i
= 0; i
< MAX_TERM
; i
++) {
605 dpp
->samplesA
[i
] = temp_A
[m
];
606 m
= (m
+ 1) & (MAX_TERM
- 1);
611 static void reverse_mono_decorr(struct Decorr
*dpp
)
613 if (dpp
->value
> MAX_TERM
) {
617 sam_A
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
619 sam_A
= (3 * dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1;
621 dpp
->samplesA
[1] = dpp
->samplesA
[0];
622 dpp
->samplesA
[0] = sam_A
;
625 sam_A
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
627 sam_A
= (3 * dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1;
629 dpp
->samplesA
[1] = sam_A
;
630 } else if (dpp
->value
> 1) {
633 for (i
= 0, j
= dpp
->value
- 1, k
= 0; k
< dpp
->value
/ 2; i
++, j
--, k
++) {
636 dpp
->samplesA
[i
] ^= dpp
->samplesA
[j
];
637 dpp
->samplesA
[j
] ^= dpp
->samplesA
[i
];
638 dpp
->samplesA
[i
] ^= dpp
->samplesA
[j
];
643 #define count_bits(av) ((av) ? 32 - ff_clz(av) : 0)
645 static uint32_t log2sample(uint32_t v
, int limit
, uint32_t *result
)
647 uint32_t dbits
= count_bits(v
);
649 if ((v
+= v
>> 9) < (1 << 8)) {
650 *result
+= (dbits
<< 8) + ff_wp_log2_table
[(v
<< (9 - dbits
)) & 0xff];
652 *result
+= dbits
= (dbits
<< 8) + ff_wp_log2_table
[(v
>> (dbits
- 9)) & 0xff];
654 if (limit
&& dbits
>= limit
)
661 static uint32_t log2mono(int32_t *samples
, int nb_samples
, int limit
)
664 while (nb_samples
--) {
665 if (log2sample(abs(*samples
++), limit
, &result
))
671 static uint32_t log2stereo(int32_t *samples_l
, int32_t *samples_r
,
672 int nb_samples
, int limit
)
675 while (nb_samples
--) {
676 if (log2sample(abs(*samples_l
++), limit
, &result
) ||
677 log2sample(abs(*samples_r
++), limit
, &result
))
683 static void decorr_mono_buffer(int32_t *samples
, int32_t *outsamples
,
684 int nb_samples
, struct Decorr
*dpp
,
687 struct Decorr dp
, *dppi
= dpp
+ tindex
;
688 int delta
= dppi
->delta
, pre_delta
, term
= dppi
->value
;
695 pre_delta
= delta
+ 1;
699 dp
.delta
= pre_delta
;
700 decorr_mono(samples
, outsamples
, FFMIN(2048, nb_samples
), &dp
, -1);
704 reverse_mono_decorr(&dp
);
708 memcpy(dppi
->samplesA
, dp
.samplesA
, sizeof(dp
.samplesA
));
709 dppi
->weightA
= dp
.weightA
;
713 decorr_mono(samples
, outsamples
, nb_samples
, &dp
, 1);
715 memcpy(dp
.samplesA
, dppi
->samplesA
, sizeof(dp
.samplesA
));
716 dppi
->weightA
= dp
.weightA
= dp
.sumA
/ nb_samples
;
719 decorr_mono(samples
, outsamples
, nb_samples
, &dp
, 1);
722 static void recurse_mono(WavPackEncodeContext
*s
, WavPackExtraInfo
*info
,
723 int depth
, int delta
, uint32_t input_bits
)
725 int term
, branches
= s
->num_branches
- depth
;
726 int32_t *samples
, *outsamples
;
727 uint32_t term_bits
[22], bits
;
729 if (branches
< 1 || depth
+ 1 == info
->nterms
)
733 samples
= s
->sampleptrs
[depth
][0];
734 outsamples
= s
->sampleptrs
[depth
+ 1][0];
736 for (term
= 1; term
<= 18; term
++) {
737 if (term
== 17 && branches
== 1 && depth
+ 1 < info
->nterms
)
740 if (term
> 8 && term
< 17)
743 if (!s
->extra_flags
&& (term
> 4 && term
< 17))
746 info
->dps
[depth
].value
= term
;
747 info
->dps
[depth
].delta
= delta
;
748 decorr_mono_buffer(samples
, outsamples
, s
->block_samples
, info
->dps
, depth
);
749 bits
= log2mono(outsamples
, s
->block_samples
, info
->log_limit
);
751 if (bits
< info
->best_bits
) {
752 info
->best_bits
= bits
;
753 CLEAR(s
->decorr_passes
);
754 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * (depth
+ 1));
755 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0],
756 s
->sampleptrs
[depth
+ 1][0], s
->block_samples
* 4);
759 term_bits
[term
+ 3] = bits
;
762 while (depth
+ 1 < info
->nterms
&& branches
--) {
763 uint32_t local_best_bits
= input_bits
;
764 int best_term
= 0, i
;
766 for (i
= 0; i
< 22; i
++)
767 if (term_bits
[i
] && term_bits
[i
] < local_best_bits
) {
768 local_best_bits
= term_bits
[i
];
775 term_bits
[best_term
+ 3] = 0;
777 info
->dps
[depth
].value
= best_term
;
778 info
->dps
[depth
].delta
= delta
;
779 decorr_mono_buffer(samples
, outsamples
, s
->block_samples
, info
->dps
, depth
);
781 recurse_mono(s
, info
, depth
+ 1, delta
, local_best_bits
);
785 static void sort_mono(WavPackEncodeContext
*s
, WavPackExtraInfo
*info
)
793 memcpy(info
->dps
, s
->decorr_passes
, sizeof(s
->decorr_passes
));
796 for (ri
= 0; ri
< info
->nterms
&& s
->decorr_passes
[ri
].value
; ri
++) {
798 if (ri
+ 1 >= info
->nterms
|| !s
->decorr_passes
[ri
+1].value
)
801 if (s
->decorr_passes
[ri
].value
== s
->decorr_passes
[ri
+1].value
) {
802 decorr_mono_buffer(s
->sampleptrs
[ri
][0], s
->sampleptrs
[ri
+1][0],
803 s
->block_samples
, info
->dps
, ri
);
807 info
->dps
[ri
] = s
->decorr_passes
[ri
+1];
808 info
->dps
[ri
+1] = s
->decorr_passes
[ri
];
810 for (i
= ri
; i
< info
->nterms
&& s
->decorr_passes
[i
].value
; i
++)
811 decorr_mono_buffer(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
+1][0],
812 s
->block_samples
, info
->dps
, i
);
814 bits
= log2mono(s
->sampleptrs
[i
][0], s
->block_samples
, info
->log_limit
);
815 if (bits
< info
->best_bits
) {
817 info
->best_bits
= bits
;
818 CLEAR(s
->decorr_passes
);
819 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * i
);
820 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0], s
->sampleptrs
[i
][0],
821 s
->block_samples
* 4);
823 info
->dps
[ri
] = s
->decorr_passes
[ri
];
824 info
->dps
[ri
+1] = s
->decorr_passes
[ri
+1];
825 decorr_mono_buffer(s
->sampleptrs
[ri
][0], s
->sampleptrs
[ri
+1][0],
826 s
->block_samples
, info
->dps
, ri
);
832 static void delta_mono(WavPackEncodeContext
*s
, WavPackExtraInfo
*info
)
834 int lower
= 0, delta
, d
;
837 if (!s
->decorr_passes
[0].value
)
839 delta
= s
->decorr_passes
[0].delta
;
841 for (d
= delta
- 1; d
>= 0; d
--) {
844 for (i
= 0; i
< info
->nterms
&& s
->decorr_passes
[i
].value
; i
++) {
845 info
->dps
[i
].value
= s
->decorr_passes
[i
].value
;
846 info
->dps
[i
].delta
= d
;
847 decorr_mono_buffer(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
+1][0],
848 s
->block_samples
, info
->dps
, i
);
851 bits
= log2mono(s
->sampleptrs
[i
][0], s
->block_samples
, info
->log_limit
);
852 if (bits
>= info
->best_bits
)
856 info
->best_bits
= bits
;
857 CLEAR(s
->decorr_passes
);
858 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * i
);
859 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0], s
->sampleptrs
[i
][0],
860 s
->block_samples
* 4);
863 for (d
= delta
+ 1; !lower
&& d
<= 7; d
++) {
866 for (i
= 0; i
< info
->nterms
&& s
->decorr_passes
[i
].value
; i
++) {
867 info
->dps
[i
].value
= s
->decorr_passes
[i
].value
;
868 info
->dps
[i
].delta
= d
;
869 decorr_mono_buffer(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
+1][0],
870 s
->block_samples
, info
->dps
, i
);
873 bits
= log2mono(s
->sampleptrs
[i
][0], s
->block_samples
, info
->log_limit
);
874 if (bits
>= info
->best_bits
)
877 info
->best_bits
= bits
;
878 CLEAR(s
->decorr_passes
);
879 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * i
);
880 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0], s
->sampleptrs
[i
][0],
881 s
->block_samples
* 4);
885 static int allocate_buffers2(WavPackEncodeContext
*s
, int nterms
)
889 for (i
= 0; i
< nterms
+ 2; i
++) {
890 av_fast_padded_malloc(&s
->sampleptrs
[i
][0], &s
->sampleptrs_size
[i
][0],
891 s
->block_samples
* 4);
892 if (!s
->sampleptrs
[i
][0])
893 return AVERROR(ENOMEM
);
894 if (!(s
->flags
& WV_MONO_DATA
)) {
895 av_fast_padded_malloc(&s
->sampleptrs
[i
][1], &s
->sampleptrs_size
[i
][1],
896 s
->block_samples
* 4);
897 if (!s
->sampleptrs
[i
][1])
898 return AVERROR(ENOMEM
);
905 static int allocate_buffers(WavPackEncodeContext
*s
)
909 for (i
= 0; i
< 2; i
++) {
910 av_fast_padded_malloc(&s
->best_buffer
[0], &s
->best_buffer_size
[0],
911 s
->block_samples
* 4);
912 if (!s
->best_buffer
[0])
913 return AVERROR(ENOMEM
);
915 av_fast_padded_malloc(&s
->temp_buffer
[i
][0], &s
->temp_buffer_size
[i
][0],
916 s
->block_samples
* 4);
917 if (!s
->temp_buffer
[i
][0])
918 return AVERROR(ENOMEM
);
919 if (!(s
->flags
& WV_MONO_DATA
)) {
920 av_fast_padded_malloc(&s
->best_buffer
[1], &s
->best_buffer_size
[1],
921 s
->block_samples
* 4);
922 if (!s
->best_buffer
[1])
923 return AVERROR(ENOMEM
);
925 av_fast_padded_malloc(&s
->temp_buffer
[i
][1], &s
->temp_buffer_size
[i
][1],
926 s
->block_samples
* 4);
927 if (!s
->temp_buffer
[i
][1])
928 return AVERROR(ENOMEM
);
935 static void analyze_mono(WavPackEncodeContext
*s
, int32_t *samples
, int do_samples
)
937 WavPackExtraInfo info
;
940 info
.log_limit
= (((s
->flags
& MAG_MASK
) >> MAG_LSB
) + 4) * 256;
941 info
.log_limit
= FFMIN(6912, info
.log_limit
);
943 info
.nterms
= s
->num_terms
;
945 if (allocate_buffers2(s
, s
->num_terms
))
948 memcpy(info
.dps
, s
->decorr_passes
, sizeof(info
.dps
));
949 memcpy(s
->sampleptrs
[0][0], samples
, s
->block_samples
* 4);
951 for (i
= 0; i
< info
.nterms
&& info
.dps
[i
].value
; i
++)
952 decorr_mono(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
+ 1][0],
953 s
->block_samples
, info
.dps
+ i
, 1);
955 info
.best_bits
= log2mono(s
->sampleptrs
[info
.nterms
][0], s
->block_samples
, 0) * 1;
956 memcpy(s
->sampleptrs
[info
.nterms
+ 1][0], s
->sampleptrs
[i
][0], s
->block_samples
* 4);
958 if (s
->extra_flags
& EXTRA_BRANCHES
)
959 recurse_mono(s
, &info
, 0, (int) floor(s
->delta_decay
+ 0.5),
960 log2mono(s
->sampleptrs
[0][0], s
->block_samples
, 0));
962 if (s
->extra_flags
& EXTRA_SORT_FIRST
)
965 if (s
->extra_flags
& EXTRA_TRY_DELTAS
) {
966 delta_mono(s
, &info
);
968 if ((s
->extra_flags
& EXTRA_ADJUST_DELTAS
) && s
->decorr_passes
[0].value
)
969 s
->delta_decay
= (float)((s
->delta_decay
* 2.0 + s
->decorr_passes
[0].delta
) / 3.0);
971 s
->delta_decay
= 2.0;
974 if (s
->extra_flags
& EXTRA_SORT_LAST
)
978 memcpy(samples
, s
->sampleptrs
[info
.nterms
+ 1][0], s
->block_samples
* 4);
980 for (i
= 0; i
< info
.nterms
; i
++)
981 if (!s
->decorr_passes
[i
].value
)
987 static void scan_word(WavPackEncodeContext
*s
, WvChannel
*c
,
988 int32_t *samples
, int nb_samples
, int dir
)
991 samples
+= nb_samples
- 1;
993 while (nb_samples
--) {
994 uint32_t low
, value
= labs(samples
[0]);
996 if (value
< GET_MED(0)) {
1002 if (value
- low
< GET_MED(1)) {
1008 if (value
- low
< GET_MED(2)) {
1019 static int wv_mono(WavPackEncodeContext
*s
, int32_t *samples
,
1020 int no_history
, int do_samples
)
1022 struct Decorr temp_decorr_pass
, save_decorr_passes
[MAX_TERMS
] = {{0}};
1023 int nb_samples
= s
->block_samples
;
1024 int buf_size
= sizeof(int32_t) * nb_samples
;
1025 uint32_t best_size
= UINT32_MAX
, size
;
1026 int log_limit
, pi
, i
, ret
;
1028 for (i
= 0; i
< nb_samples
; i
++)
1032 if (i
== nb_samples
) {
1033 CLEAR(s
->decorr_passes
);
1039 log_limit
= (((s
->flags
& MAG_MASK
) >> MAG_LSB
) + 4) * 256;
1040 log_limit
= FFMIN(6912, log_limit
);
1042 if ((ret
= allocate_buffers(s
)) < 0)
1045 if (no_history
|| s
->num_passes
>= 7)
1046 s
->best_decorr
= s
->mask_decorr
= 0;
1048 for (pi
= 0; pi
< s
->num_passes
;) {
1049 const WavPackDecorrSpec
*wpds
;
1055 if (s
->mask_decorr
== 0)
1058 c
= (s
->best_decorr
& (s
->mask_decorr
- 1)) | s
->mask_decorr
;
1060 if (c
== s
->best_decorr
) {
1061 s
->mask_decorr
= s
->mask_decorr
? ((s
->mask_decorr
<< 1) & (s
->num_decorrs
- 1)) : 1;
1066 wpds
= &s
->decorr_specs
[c
];
1067 nterms
= decorr_filter_nterms
[s
->decorr_filter
];
1070 memcpy(s
->temp_buffer
[0][0], samples
, buf_size
);
1071 CLEAR(save_decorr_passes
);
1073 for (j
= 0; j
< nterms
; j
++) {
1074 CLEAR(temp_decorr_pass
);
1075 temp_decorr_pass
.delta
= wpds
->delta
;
1076 temp_decorr_pass
.value
= wpds
->terms
[j
];
1078 if (temp_decorr_pass
.value
< 0)
1079 temp_decorr_pass
.value
= 1;
1081 decorr_mono(s
->temp_buffer
[j
&1][0], s
->temp_buffer
[~j
&1][0],
1082 FFMIN(nb_samples
, 2048), &temp_decorr_pass
, -1);
1085 CLEAR(temp_decorr_pass
.samplesA
);
1087 reverse_mono_decorr(&temp_decorr_pass
);
1090 memcpy(save_decorr_passes
+ j
, &temp_decorr_pass
, sizeof(struct Decorr
));
1091 decorr_mono(s
->temp_buffer
[j
&1][0], s
->temp_buffer
[~j
&1][0],
1092 nb_samples
, &temp_decorr_pass
, 1);
1095 size
= log2mono(s
->temp_buffer
[j
&1][0], nb_samples
, log_limit
);
1096 if (size
!= UINT32_MAX
|| !nterms
)
1101 if (size
< best_size
) {
1102 memcpy(s
->best_buffer
[0], s
->temp_buffer
[j
&1][0], buf_size
);
1103 memcpy(s
->decorr_passes
, save_decorr_passes
, sizeof(struct Decorr
) * MAX_TERMS
);
1104 s
->num_terms
= nterms
;
1110 s
->mask_decorr
= s
->mask_decorr
? ((s
->mask_decorr
<< 1) & (s
->num_decorrs
- 1)) : 1;
1114 analyze_mono(s
, samples
, do_samples
);
1115 else if (do_samples
)
1116 memcpy(samples
, s
->best_buffer
[0], buf_size
);
1118 if (no_history
|| s
->extra_flags
) {
1120 scan_word(s
, &s
->w
.c
[0], s
->best_buffer
[0], nb_samples
, -1);
1125 static void decorr_stereo(int32_t *in_left
, int32_t *in_right
,
1126 int32_t *out_left
, int32_t *out_right
,
1127 int nb_samples
, struct Decorr
*dpp
, int dir
)
1131 dpp
->sumA
= dpp
->sumB
= 0;
1134 out_left
+= nb_samples
- 1;
1135 out_right
+= nb_samples
- 1;
1136 in_left
+= nb_samples
- 1;
1137 in_right
+= nb_samples
- 1;
1140 dpp
->weightA
= restore_weight(store_weight(dpp
->weightA
));
1141 dpp
->weightB
= restore_weight(store_weight(dpp
->weightB
));
1143 for (i
= 0; i
< MAX_TERM
; i
++) {
1144 dpp
->samplesA
[i
] = wp_exp2(log2s(dpp
->samplesA
[i
]));
1145 dpp
->samplesB
[i
] = wp_exp2(log2s(dpp
->samplesB
[i
]));
1148 switch (dpp
->value
) {
1150 while (nb_samples
--) {
1153 sam
= dpp
->samplesA
[0];
1154 dpp
->samplesA
[0] = dpp
->samplesA
[1];
1155 out_left
[0] = tmp
= (dpp
->samplesA
[1] = in_left
[0]) - APPLY_WEIGHT(dpp
->weightA
, sam
);
1156 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1157 dpp
->sumA
+= dpp
->weightA
;
1159 sam
= dpp
->samplesB
[0];
1160 dpp
->samplesB
[0] = dpp
->samplesB
[1];
1161 out_right
[0] = tmp
= (dpp
->samplesB
[1] = in_right
[0]) - APPLY_WEIGHT(dpp
->weightB
, sam
);
1162 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1163 dpp
->sumB
+= dpp
->weightB
;
1172 while (nb_samples
--) {
1175 sam
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
1176 dpp
->samplesA
[1] = dpp
->samplesA
[0];
1177 out_left
[0] = tmp
= (dpp
->samplesA
[0] = in_left
[0]) - APPLY_WEIGHT(dpp
->weightA
, sam
);
1178 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1179 dpp
->sumA
+= dpp
->weightA
;
1181 sam
= 2 * dpp
->samplesB
[0] - dpp
->samplesB
[1];
1182 dpp
->samplesB
[1] = dpp
->samplesB
[0];
1183 out_right
[0] = tmp
= (dpp
->samplesB
[0] = in_right
[0]) - APPLY_WEIGHT (dpp
->weightB
, sam
);
1184 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1185 dpp
->sumB
+= dpp
->weightB
;
1194 while (nb_samples
--) {
1197 sam
= dpp
->samplesA
[0] + ((dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1);
1198 dpp
->samplesA
[1] = dpp
->samplesA
[0];
1199 out_left
[0] = tmp
= (dpp
->samplesA
[0] = in_left
[0]) - APPLY_WEIGHT(dpp
->weightA
, sam
);
1200 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1201 dpp
->sumA
+= dpp
->weightA
;
1203 sam
= dpp
->samplesB
[0] + ((dpp
->samplesB
[0] - dpp
->samplesB
[1]) >> 1);
1204 dpp
->samplesB
[1] = dpp
->samplesB
[0];
1205 out_right
[0] = tmp
= (dpp
->samplesB
[0] = in_right
[0]) - APPLY_WEIGHT(dpp
->weightB
, sam
);
1206 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1207 dpp
->sumB
+= dpp
->weightB
;
1216 int k
= dpp
->value
& (MAX_TERM
- 1);
1218 while (nb_samples
--) {
1221 sam
= dpp
->samplesA
[m
];
1222 out_left
[0] = tmp
= (dpp
->samplesA
[k
] = in_left
[0]) - APPLY_WEIGHT(dpp
->weightA
, sam
);
1223 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1224 dpp
->sumA
+= dpp
->weightA
;
1226 sam
= dpp
->samplesB
[m
];
1227 out_right
[0] = tmp
= (dpp
->samplesB
[k
] = in_right
[0]) - APPLY_WEIGHT(dpp
->weightB
, sam
);
1228 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1229 dpp
->sumB
+= dpp
->weightB
;
1235 m
= (m
+ 1) & (MAX_TERM
- 1);
1236 k
= (k
+ 1) & (MAX_TERM
- 1);
1240 int32_t temp_A
[MAX_TERM
], temp_B
[MAX_TERM
];
1243 memcpy(temp_A
, dpp
->samplesA
, sizeof(dpp
->samplesA
));
1244 memcpy(temp_B
, dpp
->samplesB
, sizeof(dpp
->samplesB
));
1246 for (k
= 0; k
< MAX_TERM
; k
++) {
1247 dpp
->samplesA
[k
] = temp_A
[m
];
1248 dpp
->samplesB
[k
] = temp_B
[m
];
1249 m
= (m
+ 1) & (MAX_TERM
- 1);
1255 while (nb_samples
--) {
1256 int32_t sam_A
, sam_B
, tmp
;
1258 sam_A
= dpp
->samplesA
[0];
1259 out_left
[0] = tmp
= (sam_B
= in_left
[0]) - APPLY_WEIGHT(dpp
->weightA
, sam_A
);
1260 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
1261 dpp
->sumA
+= dpp
->weightA
;
1263 out_right
[0] = tmp
= (dpp
->samplesA
[0] = in_right
[0]) - APPLY_WEIGHT(dpp
->weightB
, sam_B
);
1264 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
1265 dpp
->sumB
+= dpp
->weightB
;
1274 while (nb_samples
--) {
1275 int32_t sam_A
, sam_B
, tmp
;
1277 sam_B
= dpp
->samplesB
[0];
1278 out_right
[0] = tmp
= (sam_A
= in_right
[0]) - APPLY_WEIGHT(dpp
->weightB
, sam_B
);
1279 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
1280 dpp
->sumB
+= dpp
->weightB
;
1282 out_left
[0] = tmp
= (dpp
->samplesB
[0] = in_left
[0]) - APPLY_WEIGHT(dpp
->weightA
, sam_A
);
1283 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
1284 dpp
->sumA
+= dpp
->weightA
;
1293 while (nb_samples
--) {
1294 int32_t sam_A
, sam_B
, tmp
;
1296 sam_A
= dpp
->samplesA
[0];
1297 sam_B
= dpp
->samplesB
[0];
1299 dpp
->samplesA
[0] = tmp
= in_right
[0];
1300 out_right
[0] = tmp
-= APPLY_WEIGHT(dpp
->weightB
, sam_B
);
1301 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
1302 dpp
->sumB
+= dpp
->weightB
;
1304 dpp
->samplesB
[0] = tmp
= in_left
[0];
1305 out_left
[0] = tmp
-= APPLY_WEIGHT(dpp
->weightA
, sam_A
);
1306 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
1307 dpp
->sumA
+= dpp
->weightA
;
1318 static void reverse_decorr(struct Decorr
*dpp
)
1320 if (dpp
->value
> MAX_TERM
) {
1321 int32_t sam_A
, sam_B
;
1323 if (dpp
->value
& 1) {
1324 sam_A
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
1325 sam_B
= 2 * dpp
->samplesB
[0] - dpp
->samplesB
[1];
1327 sam_A
= (3 * dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1;
1328 sam_B
= (3 * dpp
->samplesB
[0] - dpp
->samplesB
[1]) >> 1;
1331 dpp
->samplesA
[1] = dpp
->samplesA
[0];
1332 dpp
->samplesB
[1] = dpp
->samplesB
[0];
1333 dpp
->samplesA
[0] = sam_A
;
1334 dpp
->samplesB
[0] = sam_B
;
1336 if (dpp
->value
& 1) {
1337 sam_A
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
1338 sam_B
= 2 * dpp
->samplesB
[0] - dpp
->samplesB
[1];
1340 sam_A
= (3 * dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1;
1341 sam_B
= (3 * dpp
->samplesB
[0] - dpp
->samplesB
[1]) >> 1;
1344 dpp
->samplesA
[1] = sam_A
;
1345 dpp
->samplesB
[1] = sam_B
;
1346 } else if (dpp
->value
> 1) {
1349 for (i
= 0, j
= dpp
->value
- 1, k
= 0; k
< dpp
->value
/ 2; i
++, j
--, k
++) {
1350 i
&= (MAX_TERM
- 1);
1351 j
&= (MAX_TERM
- 1);
1352 dpp
->samplesA
[i
] ^= dpp
->samplesA
[j
];
1353 dpp
->samplesA
[j
] ^= dpp
->samplesA
[i
];
1354 dpp
->samplesA
[i
] ^= dpp
->samplesA
[j
];
1355 dpp
->samplesB
[i
] ^= dpp
->samplesB
[j
];
1356 dpp
->samplesB
[j
] ^= dpp
->samplesB
[i
];
1357 dpp
->samplesB
[i
] ^= dpp
->samplesB
[j
];
1362 static void decorr_stereo_quick(int32_t *in_left
, int32_t *in_right
,
1363 int32_t *out_left
, int32_t *out_right
,
1364 int nb_samples
, struct Decorr
*dpp
)
1368 dpp
->weightA
= restore_weight(store_weight(dpp
->weightA
));
1369 dpp
->weightB
= restore_weight(store_weight(dpp
->weightB
));
1371 for (i
= 0; i
< MAX_TERM
; i
++) {
1372 dpp
->samplesA
[i
] = wp_exp2(log2s(dpp
->samplesA
[i
]));
1373 dpp
->samplesB
[i
] = wp_exp2(log2s(dpp
->samplesB
[i
]));
1376 switch (dpp
->value
) {
1378 for (i
= 0; i
< nb_samples
; i
++) {
1381 sam
= dpp
->samplesA
[0];
1382 dpp
->samplesA
[0] = dpp
->samplesA
[1];
1383 out_left
[i
] = tmp
= (dpp
->samplesA
[1] = in_left
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam
);
1384 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1386 sam
= dpp
->samplesB
[0];
1387 dpp
->samplesB
[0] = dpp
->samplesB
[1];
1388 out_right
[i
] = tmp
= (dpp
->samplesB
[1] = in_right
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam
);
1389 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1393 for (i
= 0; i
< nb_samples
; i
++) {
1396 sam
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
1397 dpp
->samplesA
[1] = dpp
->samplesA
[0];
1398 out_left
[i
] = tmp
= (dpp
->samplesA
[0] = in_left
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam
);
1399 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1401 sam
= 2 * dpp
->samplesB
[0] - dpp
->samplesB
[1];
1402 dpp
->samplesB
[1] = dpp
->samplesB
[0];
1403 out_right
[i
] = tmp
= (dpp
->samplesB
[0] = in_right
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam
);
1404 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1408 for (i
= 0; i
< nb_samples
; i
++) {
1411 sam
= dpp
->samplesA
[0] + ((dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1);
1412 dpp
->samplesA
[1] = dpp
->samplesA
[0];
1413 out_left
[i
] = tmp
= (dpp
->samplesA
[0] = in_left
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam
);
1414 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1416 sam
= dpp
->samplesB
[0] + ((dpp
->samplesB
[0] - dpp
->samplesB
[1]) >> 1);
1417 dpp
->samplesB
[1] = dpp
->samplesB
[0];
1418 out_right
[i
] = tmp
= (dpp
->samplesB
[0] = in_right
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam
);
1419 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1423 int k
= dpp
->value
& (MAX_TERM
- 1);
1425 for (i
= 0; i
< nb_samples
; i
++) {
1428 sam
= dpp
->samplesA
[m
];
1429 out_left
[i
] = tmp
= (dpp
->samplesA
[k
] = in_left
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam
);
1430 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
1432 sam
= dpp
->samplesB
[m
];
1433 out_right
[i
] = tmp
= (dpp
->samplesB
[k
] = in_right
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam
);
1434 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
1436 m
= (m
+ 1) & (MAX_TERM
- 1);
1437 k
= (k
+ 1) & (MAX_TERM
- 1);
1441 int32_t temp_A
[MAX_TERM
], temp_B
[MAX_TERM
];
1444 memcpy(temp_A
, dpp
->samplesA
, sizeof(dpp
->samplesA
));
1445 memcpy(temp_B
, dpp
->samplesB
, sizeof(dpp
->samplesB
));
1447 for (k
= 0; k
< MAX_TERM
; k
++) {
1448 dpp
->samplesA
[k
] = temp_A
[m
];
1449 dpp
->samplesB
[k
] = temp_B
[m
];
1450 m
= (m
+ 1) & (MAX_TERM
- 1);
1456 for (i
= 0; i
< nb_samples
; i
++) {
1457 int32_t sam_A
, sam_B
, tmp
;
1459 sam_A
= dpp
->samplesA
[0];
1460 out_left
[i
] = tmp
= (sam_B
= in_left
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam_A
);
1461 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
1463 out_right
[i
] = tmp
= (dpp
->samplesA
[0] = in_right
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam_B
);
1464 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
1468 for (i
= 0; i
< nb_samples
; i
++) {
1469 int32_t sam_A
, sam_B
, tmp
;
1471 sam_B
= dpp
->samplesB
[0];
1472 out_right
[i
] = tmp
= (sam_A
= in_right
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam_B
);
1473 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
1475 out_left
[i
] = tmp
= (dpp
->samplesB
[0] = in_left
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam_A
);
1476 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
1480 for (i
= 0; i
< nb_samples
; i
++) {
1481 int32_t sam_A
, sam_B
, tmp
;
1483 sam_A
= dpp
->samplesA
[0];
1484 sam_B
= dpp
->samplesB
[0];
1486 dpp
->samplesA
[0] = tmp
= in_right
[i
];
1487 out_right
[i
] = tmp
-= APPLY_WEIGHT_I(dpp
->weightB
, sam_B
);
1488 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
1490 dpp
->samplesB
[0] = tmp
= in_left
[i
];
1491 out_left
[i
] = tmp
-= APPLY_WEIGHT_I(dpp
->weightA
, sam_A
);
1492 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
1498 static void decorr_stereo_buffer(WavPackExtraInfo
*info
,
1499 int32_t *in_left
, int32_t *in_right
,
1500 int32_t *out_left
, int32_t *out_right
,
1501 int nb_samples
, int tindex
)
1503 struct Decorr dp
= {0}, *dppi
= info
->dps
+ tindex
;
1504 int delta
= dppi
->delta
, pre_delta
;
1505 int term
= dppi
->value
;
1512 pre_delta
= delta
+ 1;
1515 dp
.delta
= pre_delta
;
1516 decorr_stereo(in_left
, in_right
, out_left
, out_right
,
1517 FFMIN(2048, nb_samples
), &dp
, -1);
1521 reverse_decorr(&dp
);
1527 memcpy(dppi
->samplesA
, dp
.samplesA
, sizeof(dp
.samplesA
));
1528 memcpy(dppi
->samplesB
, dp
.samplesB
, sizeof(dp
.samplesB
));
1529 dppi
->weightA
= dp
.weightA
;
1530 dppi
->weightB
= dp
.weightB
;
1534 decorr_stereo(in_left
, in_right
, out_left
, out_right
, nb_samples
, &dp
, 1);
1536 memcpy(dp
.samplesA
, dppi
->samplesA
, sizeof(dp
.samplesA
));
1537 memcpy(dp
.samplesB
, dppi
->samplesB
, sizeof(dp
.samplesB
));
1538 dppi
->weightA
= dp
.weightA
= dp
.sumA
/ nb_samples
;
1539 dppi
->weightB
= dp
.weightB
= dp
.sumB
/ nb_samples
;
1543 decorr_stereo(in_left
, in_right
, out_left
, out_right
,
1544 nb_samples
, &dp
, 1);
1546 decorr_stereo_quick(in_left
, in_right
, out_left
, out_right
,
1550 static void sort_stereo(WavPackEncodeContext
*s
, WavPackExtraInfo
*info
)
1558 memcpy(info
->dps
, s
->decorr_passes
, sizeof(s
->decorr_passes
));
1561 for (ri
= 0; ri
< info
->nterms
&& s
->decorr_passes
[ri
].value
; ri
++) {
1563 if (ri
+ 1 >= info
->nterms
|| !s
->decorr_passes
[ri
+1].value
)
1566 if (s
->decorr_passes
[ri
].value
== s
->decorr_passes
[ri
+1].value
) {
1567 decorr_stereo_buffer(info
,
1568 s
->sampleptrs
[ri
][0], s
->sampleptrs
[ri
][1],
1569 s
->sampleptrs
[ri
+1][0], s
->sampleptrs
[ri
+1][1],
1570 s
->block_samples
, ri
);
1574 info
->dps
[ri
] = s
->decorr_passes
[ri
+1];
1575 info
->dps
[ri
+1] = s
->decorr_passes
[ri
];
1577 for (i
= ri
; i
< info
->nterms
&& s
->decorr_passes
[i
].value
; i
++)
1578 decorr_stereo_buffer(info
,
1579 s
->sampleptrs
[i
][0], s
->sampleptrs
[i
][1],
1580 s
->sampleptrs
[i
+1][0], s
->sampleptrs
[i
+1][1],
1581 s
->block_samples
, i
);
1583 bits
= log2stereo(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
][1],
1584 s
->block_samples
, info
->log_limit
);
1586 if (bits
< info
->best_bits
) {
1588 info
->best_bits
= bits
;
1589 CLEAR(s
->decorr_passes
);
1590 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * i
);
1591 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0],
1592 s
->sampleptrs
[i
][0], s
->block_samples
* 4);
1593 memcpy(s
->sampleptrs
[info
->nterms
+ 1][1],
1594 s
->sampleptrs
[i
][1], s
->block_samples
* 4);
1596 info
->dps
[ri
] = s
->decorr_passes
[ri
];
1597 info
->dps
[ri
+1] = s
->decorr_passes
[ri
+1];
1598 decorr_stereo_buffer(info
,
1599 s
->sampleptrs
[ri
][0], s
->sampleptrs
[ri
][1],
1600 s
->sampleptrs
[ri
+1][0], s
->sampleptrs
[ri
+1][1],
1601 s
->block_samples
, ri
);
1607 static void delta_stereo(WavPackEncodeContext
*s
, WavPackExtraInfo
*info
)
1609 int lower
= 0, delta
, d
, i
;
1612 if (!s
->decorr_passes
[0].value
)
1614 delta
= s
->decorr_passes
[0].delta
;
1616 for (d
= delta
- 1; d
>= 0; d
--) {
1617 for (i
= 0; i
< info
->nterms
&& s
->decorr_passes
[i
].value
; i
++) {
1618 info
->dps
[i
].value
= s
->decorr_passes
[i
].value
;
1619 info
->dps
[i
].delta
= d
;
1620 decorr_stereo_buffer(info
,
1621 s
->sampleptrs
[i
][0], s
->sampleptrs
[i
][1],
1622 s
->sampleptrs
[i
+1][0], s
->sampleptrs
[i
+1][1],
1623 s
->block_samples
, i
);
1626 bits
= log2stereo(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
][1],
1627 s
->block_samples
, info
->log_limit
);
1628 if (bits
>= info
->best_bits
)
1631 info
->best_bits
= bits
;
1632 CLEAR(s
->decorr_passes
);
1633 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * i
);
1634 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0], s
->sampleptrs
[i
][0],
1635 s
->block_samples
* 4);
1636 memcpy(s
->sampleptrs
[info
->nterms
+ 1][1], s
->sampleptrs
[i
][1],
1637 s
->block_samples
* 4);
1640 for (d
= delta
+ 1; !lower
&& d
<= 7; d
++) {
1641 for (i
= 0; i
< info
->nterms
&& s
->decorr_passes
[i
].value
; i
++) {
1642 info
->dps
[i
].value
= s
->decorr_passes
[i
].value
;
1643 info
->dps
[i
].delta
= d
;
1644 decorr_stereo_buffer(info
,
1645 s
->sampleptrs
[i
][0], s
->sampleptrs
[i
][1],
1646 s
->sampleptrs
[i
+1][0], s
->sampleptrs
[i
+1][1],
1647 s
->block_samples
, i
);
1650 bits
= log2stereo(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
][1],
1651 s
->block_samples
, info
->log_limit
);
1653 if (bits
< info
->best_bits
) {
1654 info
->best_bits
= bits
;
1655 CLEAR(s
->decorr_passes
);
1656 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * i
);
1657 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0],
1658 s
->sampleptrs
[i
][0], s
->block_samples
* 4);
1659 memcpy(s
->sampleptrs
[info
->nterms
+ 1][1],
1660 s
->sampleptrs
[i
][1], s
->block_samples
* 4);
1667 static void recurse_stereo(WavPackEncodeContext
*s
, WavPackExtraInfo
*info
,
1668 int depth
, int delta
, uint32_t input_bits
)
1670 int term
, branches
= s
->num_branches
- depth
;
1671 int32_t *in_left
, *in_right
, *out_left
, *out_right
;
1672 uint32_t term_bits
[22], bits
;
1674 if (branches
< 1 || depth
+ 1 == info
->nterms
)
1678 in_left
= s
->sampleptrs
[depth
][0];
1679 in_right
= s
->sampleptrs
[depth
][1];
1680 out_left
= s
->sampleptrs
[depth
+ 1][0];
1681 out_right
= s
->sampleptrs
[depth
+ 1][1];
1683 for (term
= -3; term
<= 18; term
++) {
1684 if (!term
|| (term
> 8 && term
< 17))
1687 if (term
== 17 && branches
== 1 && depth
+ 1 < info
->nterms
)
1690 if (term
== -1 || term
== -2)
1691 if (!(s
->flags
& WV_CROSS_DECORR
))
1694 if (!s
->extra_flags
&& (term
> 4 && term
< 17))
1697 info
->dps
[depth
].value
= term
;
1698 info
->dps
[depth
].delta
= delta
;
1699 decorr_stereo_buffer(info
, in_left
, in_right
, out_left
, out_right
,
1700 s
->block_samples
, depth
);
1701 bits
= log2stereo(out_left
, out_right
, s
->block_samples
, info
->log_limit
);
1703 if (bits
< info
->best_bits
) {
1704 info
->best_bits
= bits
;
1705 CLEAR(s
->decorr_passes
);
1706 memcpy(s
->decorr_passes
, info
->dps
, sizeof(info
->dps
[0]) * (depth
+ 1));
1707 memcpy(s
->sampleptrs
[info
->nterms
+ 1][0], s
->sampleptrs
[depth
+ 1][0],
1708 s
->block_samples
* 4);
1709 memcpy(s
->sampleptrs
[info
->nterms
+ 1][1], s
->sampleptrs
[depth
+ 1][1],
1710 s
->block_samples
* 4);
1713 term_bits
[term
+ 3] = bits
;
1716 while (depth
+ 1 < info
->nterms
&& branches
--) {
1717 uint32_t local_best_bits
= input_bits
;
1718 int best_term
= 0, i
;
1720 for (i
= 0; i
< 22; i
++)
1721 if (term_bits
[i
] && term_bits
[i
] < local_best_bits
) {
1722 local_best_bits
= term_bits
[i
];
1729 term_bits
[best_term
+ 3] = 0;
1731 info
->dps
[depth
].value
= best_term
;
1732 info
->dps
[depth
].delta
= delta
;
1733 decorr_stereo_buffer(info
, in_left
, in_right
, out_left
, out_right
,
1734 s
->block_samples
, depth
);
1736 recurse_stereo(s
, info
, depth
+ 1, delta
, local_best_bits
);
1740 static void analyze_stereo(WavPackEncodeContext
*s
,
1741 int32_t *in_left
, int32_t *in_right
,
1744 WavPackExtraInfo info
;
1747 info
.gt16bit
= ((s
->flags
& MAG_MASK
) >> MAG_LSB
) >= 16;
1749 info
.log_limit
= (((s
->flags
& MAG_MASK
) >> MAG_LSB
) + 4) * 256;
1750 info
.log_limit
= FFMIN(6912, info
.log_limit
);
1752 info
.nterms
= s
->num_terms
;
1754 if (allocate_buffers2(s
, s
->num_terms
))
1757 memcpy(info
.dps
, s
->decorr_passes
, sizeof(info
.dps
));
1758 memcpy(s
->sampleptrs
[0][0], in_left
, s
->block_samples
* 4);
1759 memcpy(s
->sampleptrs
[0][1], in_right
, s
->block_samples
* 4);
1761 for (i
= 0; i
< info
.nterms
&& info
.dps
[i
].value
; i
++)
1763 decorr_stereo(s
->sampleptrs
[i
][0], s
->sampleptrs
[i
][1],
1764 s
->sampleptrs
[i
+ 1][0], s
->sampleptrs
[i
+ 1][1],
1765 s
->block_samples
, info
.dps
+ i
, 1);
1767 decorr_stereo_quick(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
);
1771 info
.best_bits
= log2stereo(s
->sampleptrs
[info
.nterms
][0], s
->sampleptrs
[info
.nterms
][1],
1772 s
->block_samples
, 0);
1774 memcpy(s
->sampleptrs
[info
.nterms
+ 1][0], s
->sampleptrs
[i
][0], s
->block_samples
* 4);
1775 memcpy(s
->sampleptrs
[info
.nterms
+ 1][1], s
->sampleptrs
[i
][1], s
->block_samples
* 4);
1777 if (s
->extra_flags
& EXTRA_BRANCHES
)
1778 recurse_stereo(s
, &info
, 0, (int) floor(s
->delta_decay
+ 0.5),
1779 log2stereo(s
->sampleptrs
[0][0], s
->sampleptrs
[0][1],
1780 s
->block_samples
, 0));
1782 if (s
->extra_flags
& EXTRA_SORT_FIRST
)
1783 sort_stereo(s
, &info
);
1785 if (s
->extra_flags
& EXTRA_TRY_DELTAS
) {
1786 delta_stereo(s
, &info
);
1788 if ((s
->extra_flags
& EXTRA_ADJUST_DELTAS
) && s
->decorr_passes
[0].value
)
1789 s
->delta_decay
= (float)((s
->delta_decay
* 2.0 + s
->decorr_passes
[0].delta
) / 3.0);
1791 s
->delta_decay
= 2.0;
1794 if (s
->extra_flags
& EXTRA_SORT_LAST
)
1795 sort_stereo(s
, &info
);
1798 memcpy(in_left
, s
->sampleptrs
[info
.nterms
+ 1][0], s
->block_samples
* 4);
1799 memcpy(in_right
, s
->sampleptrs
[info
.nterms
+ 1][1], s
->block_samples
* 4);
1802 for (i
= 0; i
< info
.nterms
; i
++)
1803 if (!s
->decorr_passes
[i
].value
)
1809 static int wv_stereo(WavPackEncodeContext
*s
,
1810 int32_t *samples_l
, int32_t *samples_r
,
1811 int no_history
, int do_samples
)
1813 struct Decorr temp_decorr_pass
, save_decorr_passes
[MAX_TERMS
] = {{0}};
1814 int nb_samples
= s
->block_samples
, ret
;
1815 int buf_size
= sizeof(int32_t) * nb_samples
;
1816 int log_limit
, force_js
= 0, force_ts
= 0, got_js
= 0, pi
, i
;
1817 uint32_t best_size
= UINT32_MAX
, size
;
1819 for (i
= 0; i
< nb_samples
; i
++)
1820 if (samples_l
[i
] || samples_r
[i
])
1823 if (i
== nb_samples
) {
1824 s
->flags
&= ~((uint32_t) WV_JOINT_STEREO
);
1825 CLEAR(s
->decorr_passes
);
1831 log_limit
= (((s
->flags
& MAG_MASK
) >> MAG_LSB
) + 4) * 256;
1832 log_limit
= FFMIN(6912, log_limit
);
1834 if (s
->joint
!= -1) {
1835 force_js
= s
->joint
;
1836 force_ts
= !s
->joint
;
1839 if ((ret
= allocate_buffers(s
)) < 0)
1842 if (no_history
|| s
->num_passes
>= 7)
1843 s
->best_decorr
= s
->mask_decorr
= 0;
1845 for (pi
= 0; pi
< s
->num_passes
;) {
1846 const WavPackDecorrSpec
*wpds
;
1852 if (s
->mask_decorr
== 0)
1855 c
= (s
->best_decorr
& (s
->mask_decorr
- 1)) | s
->mask_decorr
;
1857 if (c
== s
->best_decorr
) {
1858 s
->mask_decorr
= s
->mask_decorr
? ((s
->mask_decorr
<< 1) & (s
->num_decorrs
- 1)) : 1;
1863 wpds
= &s
->decorr_specs
[c
];
1864 nterms
= decorr_filter_nterms
[s
->decorr_filter
];
1867 if (force_js
|| (wpds
->joint_stereo
&& !force_ts
)) {
1869 av_fast_padded_malloc(&s
->js_left
, &s
->js_left_size
, buf_size
);
1870 av_fast_padded_malloc(&s
->js_right
, &s
->js_right_size
, buf_size
);
1871 memcpy(s
->js_left
, samples_l
, buf_size
);
1872 memcpy(s
->js_right
, samples_r
, buf_size
);
1874 for (i
= 0; i
< nb_samples
; i
++)
1875 s
->js_right
[i
] += ((s
->js_left
[i
] -= s
->js_right
[i
]) >> 1);
1879 memcpy(s
->temp_buffer
[0][0], s
->js_left
, buf_size
);
1880 memcpy(s
->temp_buffer
[0][1], s
->js_right
, buf_size
);
1882 memcpy(s
->temp_buffer
[0][0], samples_l
, buf_size
);
1883 memcpy(s
->temp_buffer
[0][1], samples_r
, buf_size
);
1886 CLEAR(save_decorr_passes
);
1888 for (j
= 0; j
< nterms
; j
++) {
1889 CLEAR(temp_decorr_pass
);
1890 temp_decorr_pass
.delta
= wpds
->delta
;
1891 temp_decorr_pass
.value
= wpds
->terms
[j
];
1893 if (temp_decorr_pass
.value
< 0 && !(s
->flags
& WV_CROSS_DECORR
))
1894 temp_decorr_pass
.value
= -3;
1896 decorr_stereo(s
->temp_buffer
[ j
&1][0], s
->temp_buffer
[ j
&1][1],
1897 s
->temp_buffer
[~j
&1][0], s
->temp_buffer
[~j
&1][1],
1898 FFMIN(2048, nb_samples
), &temp_decorr_pass
, -1);
1901 CLEAR(temp_decorr_pass
.samplesA
);
1902 CLEAR(temp_decorr_pass
.samplesB
);
1904 reverse_decorr(&temp_decorr_pass
);
1907 memcpy(save_decorr_passes
+ j
, &temp_decorr_pass
, sizeof(struct Decorr
));
1909 if (((s
->flags
& MAG_MASK
) >> MAG_LSB
) >= 16)
1910 decorr_stereo(s
->temp_buffer
[ j
&1][0], s
->temp_buffer
[ j
&1][1],
1911 s
->temp_buffer
[~j
&1][0], s
->temp_buffer
[~j
&1][1],
1912 nb_samples
, &temp_decorr_pass
, 1);
1914 decorr_stereo_quick(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
);
1919 size
= log2stereo(s
->temp_buffer
[j
&1][0], s
->temp_buffer
[j
&1][1],
1920 nb_samples
, log_limit
);
1921 if (size
!= UINT32_MAX
|| !nterms
)
1926 if (size
< best_size
) {
1927 memcpy(s
->best_buffer
[0], s
->temp_buffer
[j
&1][0], buf_size
);
1928 memcpy(s
->best_buffer
[1], s
->temp_buffer
[j
&1][1], buf_size
);
1929 memcpy(s
->decorr_passes
, save_decorr_passes
, sizeof(struct Decorr
) * MAX_TERMS
);
1930 s
->num_terms
= nterms
;
1936 s
->mask_decorr
= s
->mask_decorr
? ((s
->mask_decorr
<< 1) & (s
->num_decorrs
- 1)) : 1;
1939 if (force_js
|| (s
->decorr_specs
[s
->best_decorr
].joint_stereo
&& !force_ts
))
1940 s
->flags
|= WV_JOINT_STEREO
;
1942 s
->flags
&= ~((uint32_t) WV_JOINT_STEREO
);
1944 if (s
->extra_flags
) {
1945 if (s
->flags
& WV_JOINT_STEREO
) {
1946 analyze_stereo(s
, s
->js_left
, s
->js_right
, do_samples
);
1949 memcpy(samples_l
, s
->js_left
, buf_size
);
1950 memcpy(samples_r
, s
->js_right
, buf_size
);
1953 analyze_stereo(s
, samples_l
, samples_r
, do_samples
);
1954 } else if (do_samples
) {
1955 memcpy(samples_l
, s
->best_buffer
[0], buf_size
);
1956 memcpy(samples_r
, s
->best_buffer
[1], buf_size
);
1959 if (s
->extra_flags
|| no_history
||
1960 s
->joint_stereo
!= s
->decorr_specs
[s
->best_decorr
].joint_stereo
) {
1961 s
->joint_stereo
= s
->decorr_specs
[s
->best_decorr
].joint_stereo
;
1963 scan_word(s
, &s
->w
.c
[0], s
->best_buffer
[0], nb_samples
, -1);
1964 scan_word(s
, &s
->w
.c
[1], s
->best_buffer
[1], nb_samples
, -1);
1969 static void encode_flush(WavPackEncodeContext
*s
)
1971 WavPackWords
*w
= &s
->w
;
1972 PutBitContext
*pb
= &s
->pb
;
1975 int cbits
= count_bits(w
->zeros_acc
);
1979 put_bits(pb
, 31, 0x7FFFFFFF);
1982 put_bits(pb
, cbits
, (1U << cbits
) - 1);
1989 while (w
->zeros_acc
> 1) {
1990 put_bits(pb
, 1, w
->zeros_acc
& 1);
1997 if (w
->holding_one
) {
1998 if (w
->holding_one
>= 16) {
2001 put_bits(pb
, 16, (1 << 16) - 1);
2003 w
->holding_one
-= 16;
2004 cbits
= count_bits(w
->holding_one
);
2008 put_bits(pb
, 31, 0x7FFFFFFF);
2011 put_bits(pb
, cbits
, (1U << cbits
) - 1);
2018 while (w
->holding_one
> 1) {
2019 put_bits(pb
, 1, w
->holding_one
& 1);
2020 w
->holding_one
>>= 1;
2023 w
->holding_zero
= 0;
2025 put_bits(pb
, w
->holding_one
, (1 << w
->holding_one
) - 1);
2031 if (w
->holding_zero
) {
2033 w
->holding_zero
= 0;
2036 if (w
->pend_count
) {
2037 put_bits(pb
, w
->pend_count
, w
->pend_data
);
2038 w
->pend_data
= w
->pend_count
= 0;
2042 static void wavpack_encode_sample(WavPackEncodeContext
*s
, WvChannel
*c
, int32_t sample
)
2044 WavPackWords
*w
= &s
->w
;
2045 uint32_t ones_count
, low
, high
;
2046 int sign
= sample
< 0;
2048 if (s
->w
.c
[0].median
[0] < 2 && !s
->w
.holding_zero
&& s
->w
.c
[1].median
[0] < 2) {
2056 } else if (sample
) {
2057 put_bits(&s
->pb
, 1, 0);
2059 CLEAR(s
->w
.c
[0].median
);
2060 CLEAR(s
->w
.c
[1].median
);
2069 if (sample
< (int32_t) GET_MED(0)) {
2070 ones_count
= low
= 0;
2071 high
= GET_MED(0) - 1;
2077 if (sample
- low
< GET_MED(1)) {
2079 high
= low
+ GET_MED(1) - 1;
2085 if (sample
- low
< GET_MED(2)) {
2087 high
= low
+ GET_MED(2) - 1;
2090 ones_count
= 2 + (sample
- low
) / GET_MED(2);
2091 low
+= (ones_count
- 2) * GET_MED(2);
2092 high
= low
+ GET_MED(2) - 1;
2098 if (w
->holding_zero
) {
2105 w
->holding_zero
= 1;
2108 w
->holding_zero
= 0;
2110 w
->holding_zero
= 1;
2112 w
->holding_one
= ones_count
* 2;
2115 uint32_t maxcode
= high
- low
, code
= sample
- low
;
2116 int bitcount
= count_bits(maxcode
);
2117 uint32_t extras
= (1 << bitcount
) - maxcode
- 1;
2119 if (code
< extras
) {
2120 w
->pend_data
|= code
<< w
->pend_count
;
2121 w
->pend_count
+= bitcount
- 1;
2123 w
->pend_data
|= ((code
+ extras
) >> 1) << w
->pend_count
;
2124 w
->pend_count
+= bitcount
- 1;
2125 w
->pend_data
|= ((code
+ extras
) & 1) << w
->pend_count
++;
2129 w
->pend_data
|= ((int32_t) sign
<< w
->pend_count
++);
2131 if (!w
->holding_zero
)
2135 static void pack_int32(WavPackEncodeContext
*s
,
2136 int32_t *samples_l
, int32_t *samples_r
,
2139 const int sent_bits
= s
->int32_sent_bits
;
2140 PutBitContext
*pb
= &s
->pb
;
2143 pre_shift
= s
->int32_zeros
+ s
->int32_ones
+ s
->int32_dups
;
2148 if (s
->flags
& WV_MONO_DATA
) {
2149 for (i
= 0; i
< nb_samples
; i
++) {
2150 put_sbits(pb
, sent_bits
, samples_l
[i
] >> pre_shift
);
2153 for (i
= 0; i
< nb_samples
; i
++) {
2154 put_sbits(pb
, sent_bits
, samples_l
[i
] >> pre_shift
);
2155 put_sbits(pb
, sent_bits
, samples_r
[i
] >> pre_shift
);
2160 static void pack_float_sample(WavPackEncodeContext
*s
, int32_t *sample
)
2162 const int max_exp
= s
->float_max_exp
;
2163 PutBitContext
*pb
= &s
->pb
;
2164 int32_t value
, shift_count
;
2166 if (get_exponent(*sample
) == 255) {
2167 if (get_mantissa(*sample
)) {
2169 put_bits(pb
, 23, get_mantissa(*sample
));
2176 } else if (get_exponent(*sample
)) {
2177 shift_count
= max_exp
- get_exponent(*sample
);
2178 value
= 0x800000 + get_mantissa(*sample
);
2180 shift_count
= max_exp
? max_exp
- 1 : 0;
2181 value
= get_mantissa(*sample
);
2184 if (shift_count
< 25)
2185 value
>>= shift_count
;
2190 if (s
->float_flags
& FLOAT_ZEROS_SENT
) {
2191 if (get_exponent(*sample
) || get_mantissa(*sample
)) {
2193 put_bits(pb
, 23, get_mantissa(*sample
));
2196 put_bits(pb
, 8, get_exponent(*sample
));
2198 put_bits(pb
, 1, get_sign(*sample
));
2202 if (s
->float_flags
& FLOAT_NEG_ZEROS
)
2203 put_bits(pb
, 1, get_sign(*sample
));
2206 } else if (shift_count
) {
2207 if (s
->float_flags
& FLOAT_SHIFT_SENT
) {
2208 put_sbits(pb
, shift_count
, get_mantissa(*sample
));
2209 } else if (s
->float_flags
& FLOAT_SHIFT_SAME
) {
2210 put_bits(pb
, 1, get_mantissa(*sample
) & 1);
2215 static void pack_float(WavPackEncodeContext
*s
,
2216 int32_t *samples_l
, int32_t *samples_r
,
2221 if (s
->flags
& WV_MONO_DATA
) {
2222 for (i
= 0; i
< nb_samples
; i
++)
2223 pack_float_sample(s
, &samples_l
[i
]);
2225 for (i
= 0; i
< nb_samples
; i
++) {
2226 pack_float_sample(s
, &samples_l
[i
]);
2227 pack_float_sample(s
, &samples_r
[i
]);
2232 static void decorr_stereo_pass2(struct Decorr
*dpp
,
2233 int32_t *samples_l
, int32_t *samples_r
,
2238 switch (dpp
->value
) {
2240 for (i
= 0; i
< nb_samples
; i
++) {
2243 sam
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
2244 dpp
->samplesA
[1] = dpp
->samplesA
[0];
2245 samples_l
[i
] = tmp
= (dpp
->samplesA
[0] = samples_l
[i
]) - APPLY_WEIGHT(dpp
->weightA
, sam
);
2246 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
2248 sam
= 2 * dpp
->samplesB
[0] - dpp
->samplesB
[1];
2249 dpp
->samplesB
[1] = dpp
->samplesB
[0];
2250 samples_r
[i
] = tmp
= (dpp
->samplesB
[0] = samples_r
[i
]) - APPLY_WEIGHT(dpp
->weightB
, sam
);
2251 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
2255 for (i
= 0; i
< nb_samples
; i
++) {
2258 sam
= dpp
->samplesA
[0] + ((dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1);
2259 dpp
->samplesA
[1] = dpp
->samplesA
[0];
2260 samples_l
[i
] = tmp
= (dpp
->samplesA
[0] = samples_l
[i
]) - APPLY_WEIGHT(dpp
->weightA
, sam
);
2261 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
2263 sam
= dpp
->samplesB
[0] + ((dpp
->samplesB
[0] - dpp
->samplesB
[1]) >> 1);
2264 dpp
->samplesB
[1] = dpp
->samplesB
[0];
2265 samples_r
[i
] = tmp
= (dpp
->samplesB
[0] = samples_r
[i
]) - APPLY_WEIGHT(dpp
->weightB
, sam
);
2266 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
2270 for (m
= 0, k
= dpp
->value
& (MAX_TERM
- 1), i
= 0; i
< nb_samples
; i
++) {
2273 sam
= dpp
->samplesA
[m
];
2274 samples_l
[i
] = tmp
= (dpp
->samplesA
[k
] = samples_l
[i
]) - APPLY_WEIGHT(dpp
->weightA
, sam
);
2275 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
2277 sam
= dpp
->samplesB
[m
];
2278 samples_r
[i
] = tmp
= (dpp
->samplesB
[k
] = samples_r
[i
]) - APPLY_WEIGHT(dpp
->weightB
, sam
);
2279 UPDATE_WEIGHT(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
2281 m
= (m
+ 1) & (MAX_TERM
- 1);
2282 k
= (k
+ 1) & (MAX_TERM
- 1);
2285 int32_t temp_A
[MAX_TERM
], temp_B
[MAX_TERM
];
2287 memcpy(temp_A
, dpp
->samplesA
, sizeof (dpp
->samplesA
));
2288 memcpy(temp_B
, dpp
->samplesB
, sizeof (dpp
->samplesB
));
2290 for (k
= 0; k
< MAX_TERM
; k
++) {
2291 dpp
->samplesA
[k
] = temp_A
[m
];
2292 dpp
->samplesB
[k
] = temp_B
[m
];
2293 m
= (m
+ 1) & (MAX_TERM
- 1);
2298 for (i
= 0; i
< nb_samples
; i
++) {
2299 int32_t sam_A
, sam_B
, tmp
;
2301 sam_A
= dpp
->samplesA
[0];
2302 samples_l
[i
] = tmp
= (sam_B
= samples_l
[i
]) - APPLY_WEIGHT(dpp
->weightA
, sam_A
);
2303 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
2305 samples_r
[i
] = tmp
= (dpp
->samplesA
[0] = samples_r
[i
]) - APPLY_WEIGHT(dpp
->weightB
, sam_B
);
2306 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
2310 for (i
= 0; i
< nb_samples
; i
++) {
2311 int32_t sam_A
, sam_B
, tmp
;
2313 sam_B
= dpp
->samplesB
[0];
2314 samples_r
[i
] = tmp
= (sam_A
= samples_r
[i
]) - APPLY_WEIGHT(dpp
->weightB
, sam_B
);
2315 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
2317 samples_l
[i
] = tmp
= (dpp
->samplesB
[0] = samples_l
[i
]) - APPLY_WEIGHT(dpp
->weightA
, sam_A
);
2318 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
2322 for (i
= 0; i
< nb_samples
; i
++) {
2323 int32_t sam_A
, sam_B
, tmp
;
2325 sam_A
= dpp
->samplesA
[0];
2326 sam_B
= dpp
->samplesB
[0];
2328 dpp
->samplesA
[0] = tmp
= samples_r
[i
];
2329 samples_r
[i
] = tmp
-= APPLY_WEIGHT(dpp
->weightB
, sam_B
);
2330 UPDATE_WEIGHT_CLIP(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
2332 dpp
->samplesB
[0] = tmp
= samples_l
[i
];
2333 samples_l
[i
] = tmp
-= APPLY_WEIGHT(dpp
->weightA
, sam_A
);
2334 UPDATE_WEIGHT_CLIP(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
2340 #define update_weight_d2(weight, delta, source, result) \
2341 if (source && result) \
2342 weight -= (((source ^ result) >> 29) & 4) - 2;
2344 #define update_weight_clip_d2(weight, delta, source, result) \
2345 if (source && result) { \
2346 const int32_t s = (source ^ result) >> 31; \
2347 if ((weight = (weight ^ s) + (2 - s)) > 1024) weight = 1024; \
2348 weight = (weight ^ s) - s; \
2351 static void decorr_stereo_pass_id2(struct Decorr
*dpp
,
2352 int32_t *samples_l
, int32_t *samples_r
,
2357 switch (dpp
->value
) {
2359 for (i
= 0; i
< nb_samples
; i
++) {
2362 sam
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
2363 dpp
->samplesA
[1] = dpp
->samplesA
[0];
2364 samples_l
[i
] = tmp
= (dpp
->samplesA
[0] = samples_l
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam
);
2365 update_weight_d2(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
2367 sam
= 2 * dpp
->samplesB
[0] - dpp
->samplesB
[1];
2368 dpp
->samplesB
[1] = dpp
->samplesB
[0];
2369 samples_r
[i
] = tmp
= (dpp
->samplesB
[0] = samples_r
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam
);
2370 update_weight_d2(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
2374 for (i
= 0; i
< nb_samples
; i
++) {
2377 sam
= dpp
->samplesA
[0] + ((dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1);
2378 dpp
->samplesA
[1] = dpp
->samplesA
[0];
2379 samples_l
[i
] = tmp
= (dpp
->samplesA
[0] = samples_l
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam
);
2380 update_weight_d2(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
2382 sam
= dpp
->samplesB
[0] + ((dpp
->samplesB
[0] - dpp
->samplesB
[1]) >> 1);
2383 dpp
->samplesB
[1] = dpp
->samplesB
[0];
2384 samples_r
[i
] = tmp
= (dpp
->samplesB
[0] = samples_r
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam
);
2385 update_weight_d2(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
2389 for (m
= 0, k
= dpp
->value
& (MAX_TERM
- 1), i
= 0; i
< nb_samples
; i
++) {
2392 sam
= dpp
->samplesA
[m
];
2393 samples_l
[i
] = tmp
= (dpp
->samplesA
[k
] = samples_l
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam
);
2394 update_weight_d2(dpp
->weightA
, dpp
->delta
, sam
, tmp
);
2396 sam
= dpp
->samplesB
[m
];
2397 samples_r
[i
] = tmp
= (dpp
->samplesB
[k
] = samples_r
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam
);
2398 update_weight_d2(dpp
->weightB
, dpp
->delta
, sam
, tmp
);
2400 m
= (m
+ 1) & (MAX_TERM
- 1);
2401 k
= (k
+ 1) & (MAX_TERM
- 1);
2405 int32_t temp_A
[MAX_TERM
], temp_B
[MAX_TERM
];
2407 memcpy(temp_A
, dpp
->samplesA
, sizeof(dpp
->samplesA
));
2408 memcpy(temp_B
, dpp
->samplesB
, sizeof(dpp
->samplesB
));
2410 for (k
= 0; k
< MAX_TERM
; k
++) {
2411 dpp
->samplesA
[k
] = temp_A
[m
];
2412 dpp
->samplesB
[k
] = temp_B
[m
];
2413 m
= (m
+ 1) & (MAX_TERM
- 1);
2418 for (i
= 0; i
< nb_samples
; i
++) {
2419 int32_t sam_A
, sam_B
, tmp
;
2421 sam_A
= dpp
->samplesA
[0];
2422 samples_l
[i
] = tmp
= (sam_B
= samples_l
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam_A
);
2423 update_weight_clip_d2(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
2425 samples_r
[i
] = tmp
= (dpp
->samplesA
[0] = samples_r
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam_B
);
2426 update_weight_clip_d2(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
2430 for (i
= 0; i
< nb_samples
; i
++) {
2431 int32_t sam_A
, sam_B
, tmp
;
2433 sam_B
= dpp
->samplesB
[0];
2434 samples_r
[i
] = tmp
= (sam_A
= samples_r
[i
]) - APPLY_WEIGHT_I(dpp
->weightB
, sam_B
);
2435 update_weight_clip_d2(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
2437 samples_l
[i
] = tmp
= (dpp
->samplesB
[0] = samples_l
[i
]) - APPLY_WEIGHT_I(dpp
->weightA
, sam_A
);
2438 update_weight_clip_d2(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
2442 for (i
= 0; i
< nb_samples
; i
++) {
2443 int32_t sam_A
, sam_B
, tmp
;
2445 sam_A
= dpp
->samplesA
[0];
2446 sam_B
= dpp
->samplesB
[0];
2448 dpp
->samplesA
[0] = tmp
= samples_r
[i
];
2449 samples_r
[i
] = tmp
-= APPLY_WEIGHT_I(dpp
->weightB
, sam_B
);
2450 update_weight_clip_d2(dpp
->weightB
, dpp
->delta
, sam_B
, tmp
);
2452 dpp
->samplesB
[0] = tmp
= samples_l
[i
];
2453 samples_l
[i
] = tmp
-= APPLY_WEIGHT_I(dpp
->weightA
, sam_A
);
2454 update_weight_clip_d2(dpp
->weightA
, dpp
->delta
, sam_A
, tmp
);
2460 static void put_metadata_block(PutByteContext
*pb
, int flags
, int size
)
2463 flags
|= WP_IDF_ODD
;
2465 bytestream2_put_byte(pb
, flags
);
2466 bytestream2_put_byte(pb
, (size
+ 1) >> 1);
2469 static int wavpack_encode_block(WavPackEncodeContext
*s
,
2470 int32_t *samples_l
, int32_t *samples_r
,
2471 uint8_t *out
, int out_size
)
2473 int block_size
, start
, end
, data_size
, tcount
, temp
, m
= 0;
2474 int i
, j
, ret
= 0, got_extra
= 0, nb_samples
= s
->block_samples
;
2475 uint32_t crc
= 0xffffffffu
;
2479 if (s
->flags
& WV_MONO_DATA
) {
2482 if (!(s
->flags
& WV_MONO
) && s
->optimize_mono
) {
2483 int32_t lor
= 0, diff
= 0;
2485 for (i
= 0; i
< nb_samples
; i
++) {
2486 lor
|= samples_l
[i
] | samples_r
[i
];
2487 diff
|= samples_l
[i
] - samples_r
[i
];
2493 if (i
== nb_samples
&& lor
&& !diff
) {
2494 s
->flags
&= ~(WV_JOINT_STEREO
| WV_CROSS_DECORR
);
2495 s
->flags
|= WV_FALSE_STEREO
;
2497 if (!s
->false_stereo
) {
2498 s
->false_stereo
= 1;
2502 } else if (s
->false_stereo
) {
2503 s
->false_stereo
= 0;
2509 if (s
->flags
& SHIFT_MASK
) {
2510 int shift
= (s
->flags
& SHIFT_MASK
) >> SHIFT_LSB
;
2511 int mag
= (s
->flags
& MAG_MASK
) >> MAG_LSB
;
2513 if (s
->flags
& WV_MONO_DATA
)
2514 shift_mono(samples_l
, nb_samples
, shift
);
2516 shift_stereo(samples_l
, samples_r
, nb_samples
, shift
);
2518 if ((mag
-= shift
) < 0)
2519 s
->flags
&= ~MAG_MASK
;
2521 s
->flags
-= (1 << MAG_LSB
) * shift
;
2524 if ((s
->flags
& WV_FLOAT_DATA
) || (s
->flags
& MAG_MASK
) >> MAG_LSB
>= 24) {
2525 av_fast_padded_malloc(&s
->orig_l
, &s
->orig_l_size
, sizeof(int32_t) * nb_samples
);
2526 memcpy(s
->orig_l
, samples_l
, sizeof(int32_t) * nb_samples
);
2527 if (!(s
->flags
& WV_MONO_DATA
)) {
2528 av_fast_padded_malloc(&s
->orig_r
, &s
->orig_r_size
, sizeof(int32_t) * nb_samples
);
2529 memcpy(s
->orig_r
, samples_r
, sizeof(int32_t) * nb_samples
);
2532 if (s
->flags
& WV_FLOAT_DATA
)
2533 got_extra
= scan_float(s
, samples_l
, samples_r
, nb_samples
);
2535 got_extra
= scan_int32(s
, samples_l
, samples_r
, nb_samples
);
2538 scan_int23(s
, samples_l
, samples_r
, nb_samples
);
2539 if (s
->shift
!= s
->int32_zeros
+ s
->int32_ones
+ s
->int32_dups
) {
2540 s
->shift
= s
->int32_zeros
+ s
->int32_ones
+ s
->int32_dups
;
2545 if (!s
->num_passes
&& !s
->num_terms
) {
2548 if (s
->flags
& WV_MONO_DATA
)
2549 ret
= wv_mono(s
, samples_l
, 1, 0);
2551 ret
= wv_stereo(s
, samples_l
, samples_r
, 1, 0);
2555 if (s
->flags
& WV_MONO_DATA
) {
2556 for (i
= 0; i
< nb_samples
; i
++)
2557 crc
+= (crc
<< 1) + samples_l
[i
];
2560 ret
= wv_mono(s
, samples_l
, !s
->num_terms
, 1);
2562 for (i
= 0; i
< nb_samples
; i
++)
2563 crc
+= (crc
<< 3) + ((uint32_t)samples_l
[i
] << 1) + samples_l
[i
] + samples_r
[i
];
2566 ret
= wv_stereo(s
, samples_l
, samples_r
, !s
->num_terms
, 1);
2572 s
->flags
|= WV_INITIAL_BLOCK
;
2574 s
->ch_offset
+= 1 + !(s
->flags
& WV_MONO
);
2576 if (s
->ch_offset
== s
->avctx
->ch_layout
.nb_channels
)
2577 s
->flags
|= WV_FINAL_BLOCK
;
2579 bytestream2_init_writer(&pb
, out
, out_size
);
2580 bytestream2_put_le32(&pb
, MKTAG('w', 'v', 'p', 'k'));
2581 bytestream2_put_le32(&pb
, 0);
2582 bytestream2_put_le16(&pb
, 0x410);
2583 bytestream2_put_le16(&pb
, 0);
2584 bytestream2_put_le32(&pb
, 0);
2585 bytestream2_put_le32(&pb
, s
->sample_index
);
2586 bytestream2_put_le32(&pb
, nb_samples
);
2587 bytestream2_put_le32(&pb
, s
->flags
);
2588 bytestream2_put_le32(&pb
, crc
);
2590 if (s
->flags
& WV_INITIAL_BLOCK
&&
2591 s
->avctx
->ch_layout
.order
== AV_CHANNEL_ORDER_NATIVE
&&
2592 s
->avctx
->ch_layout
.u
.mask
!= AV_CH_LAYOUT_MONO
&&
2593 s
->avctx
->ch_layout
.u
.mask
!= AV_CH_LAYOUT_STEREO
) {
2594 put_metadata_block(&pb
, WP_ID_CHANINFO
, 5);
2595 bytestream2_put_byte(&pb
, s
->avctx
->ch_layout
.nb_channels
);
2596 if (s
->avctx
->ch_layout
.u
.mask
>> 32)
2597 bytestream2_put_le32(&pb
, 0);
2599 bytestream2_put_le32(&pb
, s
->avctx
->ch_layout
.u
.mask
);
2600 bytestream2_put_byte(&pb
, 0);
2601 } else if (s
->flags
& WV_INITIAL_BLOCK
&&
2602 s
->avctx
->ch_layout
.order
== AV_CHANNEL_ORDER_UNSPEC
) {
2603 put_metadata_block(&pb
, WP_ID_CHANINFO
, 5);
2604 bytestream2_put_byte(&pb
, s
->avctx
->ch_layout
.nb_channels
);
2605 bytestream2_put_le32(&pb
, 0);
2606 bytestream2_put_byte(&pb
, 0);
2609 if ((s
->flags
& SRATE_MASK
) == SRATE_MASK
) {
2610 put_metadata_block(&pb
, WP_ID_SAMPLE_RATE
, 3);
2611 bytestream2_put_le24(&pb
, s
->avctx
->sample_rate
);
2612 bytestream2_put_byte(&pb
, 0);
2615 put_metadata_block(&pb
, WP_ID_DECTERMS
, s
->num_terms
);
2616 for (i
= 0; i
< s
->num_terms
; i
++) {
2617 struct Decorr
*dpp
= &s
->decorr_passes
[i
];
2618 bytestream2_put_byte(&pb
, ((dpp
->value
+ 5) & 0x1f) | ((dpp
->delta
<< 5) & 0xe0));
2620 if (s
->num_terms
& 1)
2621 bytestream2_put_byte(&pb
, 0);
2623 #define WRITE_DECWEIGHT(type) do { \
2624 temp = store_weight(type); \
2625 bytestream2_put_byte(&pb, temp); \
2626 type = restore_weight(temp); \
2629 bytestream2_put_byte(&pb
, WP_ID_DECWEIGHTS
);
2630 bytestream2_put_byte(&pb
, 0);
2631 start
= bytestream2_tell_p(&pb
);
2632 for (i
= s
->num_terms
- 1; i
>= 0; --i
) {
2633 struct Decorr
*dpp
= &s
->decorr_passes
[i
];
2635 if (store_weight(dpp
->weightA
) ||
2636 (!(s
->flags
& WV_MONO_DATA
) && store_weight(dpp
->weightB
)))
2640 for (i
= 0; i
< s
->num_terms
; i
++) {
2641 struct Decorr
*dpp
= &s
->decorr_passes
[i
];
2643 WRITE_DECWEIGHT(dpp
->weightA
);
2644 if (!(s
->flags
& WV_MONO_DATA
))
2645 WRITE_DECWEIGHT(dpp
->weightB
);
2647 dpp
->weightA
= dpp
->weightB
= 0;
2650 end
= bytestream2_tell_p(&pb
);
2651 out
[start
- 2] = WP_ID_DECWEIGHTS
| (((end
- start
) & 1) ? WP_IDF_ODD
: 0);
2652 out
[start
- 1] = (end
- start
+ 1) >> 1;
2653 if ((end
- start
) & 1)
2654 bytestream2_put_byte(&pb
, 0);
2656 #define WRITE_DECSAMPLE(type) do { \
2657 temp = log2s(type); \
2658 type = wp_exp2(temp); \
2659 bytestream2_put_le16(&pb, temp); \
2662 bytestream2_put_byte(&pb
, WP_ID_DECSAMPLES
);
2663 bytestream2_put_byte(&pb
, 0);
2664 start
= bytestream2_tell_p(&pb
);
2665 for (i
= 0; i
< s
->num_terms
; i
++) {
2666 struct Decorr
*dpp
= &s
->decorr_passes
[i
];
2668 if (dpp
->value
> MAX_TERM
) {
2669 WRITE_DECSAMPLE(dpp
->samplesA
[0]);
2670 WRITE_DECSAMPLE(dpp
->samplesA
[1]);
2671 if (!(s
->flags
& WV_MONO_DATA
)) {
2672 WRITE_DECSAMPLE(dpp
->samplesB
[0]);
2673 WRITE_DECSAMPLE(dpp
->samplesB
[1]);
2675 } else if (dpp
->value
< 0) {
2676 WRITE_DECSAMPLE(dpp
->samplesA
[0]);
2677 WRITE_DECSAMPLE(dpp
->samplesB
[0]);
2679 for (j
= 0; j
< dpp
->value
; j
++) {
2680 WRITE_DECSAMPLE(dpp
->samplesA
[j
]);
2681 if (!(s
->flags
& WV_MONO_DATA
))
2682 WRITE_DECSAMPLE(dpp
->samplesB
[j
]);
2686 CLEAR(dpp
->samplesA
);
2687 CLEAR(dpp
->samplesB
);
2690 end
= bytestream2_tell_p(&pb
);
2691 out
[start
- 1] = (end
- start
) >> 1;
2693 #define WRITE_CHAN_ENTROPY(chan) do { \
2694 for (i = 0; i < 3; i++) { \
2695 temp = wp_log2(s->w.c[chan].median[i]); \
2696 bytestream2_put_le16(&pb, temp); \
2697 s->w.c[chan].median[i] = wp_exp2(temp); \
2701 put_metadata_block(&pb
, WP_ID_ENTROPY
, 6 * (1 + (!(s
->flags
& WV_MONO_DATA
))));
2702 WRITE_CHAN_ENTROPY(0);
2703 if (!(s
->flags
& WV_MONO_DATA
))
2704 WRITE_CHAN_ENTROPY(1);
2706 if (s
->flags
& WV_FLOAT_DATA
) {
2707 put_metadata_block(&pb
, WP_ID_FLOATINFO
, 4);
2708 bytestream2_put_byte(&pb
, s
->float_flags
);
2709 bytestream2_put_byte(&pb
, s
->float_shift
);
2710 bytestream2_put_byte(&pb
, s
->float_max_exp
);
2711 bytestream2_put_byte(&pb
, 127);
2714 if (s
->flags
& WV_INT32_DATA
) {
2715 put_metadata_block(&pb
, WP_ID_INT32INFO
, 4);
2716 bytestream2_put_byte(&pb
, s
->int32_sent_bits
);
2717 bytestream2_put_byte(&pb
, s
->int32_zeros
);
2718 bytestream2_put_byte(&pb
, s
->int32_ones
);
2719 bytestream2_put_byte(&pb
, s
->int32_dups
);
2722 if (s
->flags
& WV_MONO_DATA
&& !s
->num_passes
) {
2723 for (i
= 0; i
< nb_samples
; i
++) {
2724 int32_t code
= samples_l
[i
];
2726 for (tcount
= s
->num_terms
, dpp
= s
->decorr_passes
; tcount
--; dpp
++) {
2729 if (dpp
->value
> MAX_TERM
) {
2731 sam
= 2 * dpp
->samplesA
[0] - dpp
->samplesA
[1];
2733 sam
= (3 * dpp
->samplesA
[0] - dpp
->samplesA
[1]) >> 1;
2735 dpp
->samplesA
[1] = dpp
->samplesA
[0];
2736 dpp
->samplesA
[0] = code
;
2738 sam
= dpp
->samplesA
[m
];
2739 dpp
->samplesA
[(m
+ dpp
->value
) & (MAX_TERM
- 1)] = code
;
2742 code
-= APPLY_WEIGHT(dpp
->weightA
, sam
);
2743 UPDATE_WEIGHT(dpp
->weightA
, dpp
->delta
, sam
, code
);
2746 m
= (m
+ 1) & (MAX_TERM
- 1);
2747 samples_l
[i
] = code
;
2750 for (tcount
= s
->num_terms
, dpp
= s
->decorr_passes
; tcount
--; dpp
++)
2751 if (dpp
->value
> 0 && dpp
->value
<= MAX_TERM
) {
2752 int32_t temp_A
[MAX_TERM
], temp_B
[MAX_TERM
];
2755 memcpy(temp_A
, dpp
->samplesA
, sizeof(dpp
->samplesA
));
2756 memcpy(temp_B
, dpp
->samplesB
, sizeof(dpp
->samplesB
));
2758 for (k
= 0; k
< MAX_TERM
; k
++) {
2759 dpp
->samplesA
[k
] = temp_A
[m
];
2760 dpp
->samplesB
[k
] = temp_B
[m
];
2761 m
= (m
+ 1) & (MAX_TERM
- 1);
2765 } else if (!s
->num_passes
) {
2766 if (s
->flags
& WV_JOINT_STEREO
) {
2767 for (i
= 0; i
< nb_samples
; i
++)
2768 samples_r
[i
] += ((samples_l
[i
] -= samples_r
[i
]) >> 1);
2771 for (i
= 0; i
< s
->num_terms
; i
++) {
2772 struct Decorr
*dpp
= &s
->decorr_passes
[i
];
2773 if (((s
->flags
& MAG_MASK
) >> MAG_LSB
) >= 16 || dpp
->delta
!= 2)
2774 decorr_stereo_pass2(dpp
, samples_l
, samples_r
, nb_samples
);
2776 decorr_stereo_pass_id2(dpp
, samples_l
, samples_r
, nb_samples
);
2780 bytestream2_put_byte(&pb
, WP_ID_DATA
| WP_IDF_LONG
);
2781 init_put_bits(&s
->pb
, pb
.buffer
+ 3, bytestream2_get_bytes_left_p(&pb
));
2782 if (s
->flags
& WV_MONO_DATA
) {
2783 for (i
= 0; i
< nb_samples
; i
++)
2784 wavpack_encode_sample(s
, &s
->w
.c
[0], s
->samples
[0][i
]);
2786 for (i
= 0; i
< nb_samples
; i
++) {
2787 wavpack_encode_sample(s
, &s
->w
.c
[0], s
->samples
[0][i
]);
2788 wavpack_encode_sample(s
, &s
->w
.c
[1], s
->samples
[1][i
]);
2792 flush_put_bits(&s
->pb
);
2793 data_size
= put_bytes_output(&s
->pb
);
2794 bytestream2_put_le24(&pb
, (data_size
+ 1) >> 1);
2795 bytestream2_skip_p(&pb
, data_size
);
2797 bytestream2_put_byte(&pb
, 0);
2800 bytestream2_put_byte(&pb
, WP_ID_EXTRABITS
| WP_IDF_LONG
);
2801 init_put_bits(&s
->pb
, pb
.buffer
+ 7, bytestream2_get_bytes_left_p(&pb
));
2802 if (s
->flags
& WV_FLOAT_DATA
)
2803 pack_float(s
, s
->orig_l
, s
->orig_r
, nb_samples
);
2805 pack_int32(s
, s
->orig_l
, s
->orig_r
, nb_samples
);
2806 flush_put_bits(&s
->pb
);
2807 data_size
= put_bytes_output(&s
->pb
);
2808 bytestream2_put_le24(&pb
, (data_size
+ 5) >> 1);
2809 bytestream2_put_le32(&pb
, s
->crc_x
);
2810 bytestream2_skip_p(&pb
, data_size
);
2812 bytestream2_put_byte(&pb
, 0);
2815 block_size
= bytestream2_tell_p(&pb
);
2816 AV_WL32(out
+ 4, block_size
- 8);
2818 av_assert0(!bytestream2_get_eof(&pb
));
2823 static void fill_buffer(WavPackEncodeContext
*s
,
2824 const int8_t *src
, int32_t *dst
,
2829 #define COPY_SAMPLES(type, offset, shift) do { \
2830 const type *sptr = (const type *)src; \
2831 for (i = 0; i < nb_samples; i++) \
2832 dst[i] = (sptr[i] - offset) >> shift; \
2835 switch (s
->avctx
->sample_fmt
) {
2836 case AV_SAMPLE_FMT_U8P
:
2837 COPY_SAMPLES(uint8_t, 0x80, 0);
2839 case AV_SAMPLE_FMT_S16P
:
2840 COPY_SAMPLES(int16_t, 0, 0);
2842 case AV_SAMPLE_FMT_S32P
:
2843 if (s
->avctx
->bits_per_raw_sample
<= 24) {
2844 COPY_SAMPLES(int32_t, 0, 8);
2847 case AV_SAMPLE_FMT_FLTP
:
2848 memcpy(dst
, src
, nb_samples
* 4);
2852 static void set_samplerate(WavPackEncodeContext
*s
)
2856 for (i
= 0; i
< 15; i
++) {
2857 if (wv_rates
[i
] == s
->avctx
->sample_rate
)
2861 s
->flags
= i
<< SRATE_LSB
;
2864 static int wavpack_encode_frame(AVCodecContext
*avctx
, AVPacket
*avpkt
,
2865 const AVFrame
*frame
, int *got_packet_ptr
)
2867 WavPackEncodeContext
*s
= avctx
->priv_data
;
2871 s
->block_samples
= frame
->nb_samples
;
2872 av_fast_padded_malloc(&s
->samples
[0], &s
->samples_size
[0],
2873 sizeof(int32_t) * s
->block_samples
);
2875 return AVERROR(ENOMEM
);
2876 if (avctx
->ch_layout
.nb_channels
> 1) {
2877 av_fast_padded_malloc(&s
->samples
[1], &s
->samples_size
[1],
2878 sizeof(int32_t) * s
->block_samples
);
2880 return AVERROR(ENOMEM
);
2883 buf_size
= s
->block_samples
* avctx
->ch_layout
.nb_channels
* 8
2884 + 200 * avctx
->ch_layout
.nb_channels
/* for headers */;
2885 if ((ret
= ff_alloc_packet(avctx
, avpkt
, buf_size
)) < 0)
2889 for (s
->ch_offset
= 0; s
->ch_offset
< avctx
->ch_layout
.nb_channels
;) {
2892 switch (s
->avctx
->sample_fmt
) {
2893 case AV_SAMPLE_FMT_S16P
: s
->flags
|= 1; break;
2894 case AV_SAMPLE_FMT_S32P
: s
->flags
|= 3 - (s
->avctx
->bits_per_raw_sample
<= 24); break;
2895 case AV_SAMPLE_FMT_FLTP
: s
->flags
|= 3 | WV_FLOAT_DATA
;
2898 fill_buffer(s
, frame
->extended_data
[s
->ch_offset
], s
->samples
[0], s
->block_samples
);
2899 if (avctx
->ch_layout
.nb_channels
- s
->ch_offset
== 1) {
2900 s
->flags
|= WV_MONO
;
2902 s
->flags
|= WV_CROSS_DECORR
;
2903 fill_buffer(s
, frame
->extended_data
[s
->ch_offset
+ 1], s
->samples
[1], s
->block_samples
);
2906 s
->flags
+= (1 << MAG_LSB
) * ((s
->flags
& 3) * 8 + 7);
2908 if ((ret
= wavpack_encode_block(s
, s
->samples
[0], s
->samples
[1],
2909 buf
, buf_size
)) < 0)
2915 s
->sample_index
+= frame
->nb_samples
;
2917 avpkt
->size
= buf
- avpkt
->data
;
2918 *got_packet_ptr
= 1;
2922 static av_cold
int wavpack_encode_close(AVCodecContext
*avctx
)
2924 WavPackEncodeContext
*s
= avctx
->priv_data
;
2927 for (i
= 0; i
< MAX_TERMS
+ 2; i
++) {
2928 av_freep(&s
->sampleptrs
[i
][0]);
2929 av_freep(&s
->sampleptrs
[i
][1]);
2930 s
->sampleptrs_size
[i
][0] = s
->sampleptrs_size
[i
][1] = 0;
2933 for (i
= 0; i
< 2; i
++) {
2934 av_freep(&s
->samples
[i
]);
2935 s
->samples_size
[i
] = 0;
2937 av_freep(&s
->best_buffer
[i
]);
2938 s
->best_buffer_size
[i
] = 0;
2940 av_freep(&s
->temp_buffer
[i
][0]);
2941 av_freep(&s
->temp_buffer
[i
][1]);
2942 s
->temp_buffer_size
[i
][0] = s
->temp_buffer_size
[i
][1] = 0;
2945 av_freep(&s
->js_left
);
2946 av_freep(&s
->js_right
);
2947 s
->js_left_size
= s
->js_right_size
= 0;
2949 av_freep(&s
->orig_l
);
2950 av_freep(&s
->orig_r
);
2951 s
->orig_l_size
= s
->orig_r_size
= 0;
2956 #define OFFSET(x) offsetof(WavPackEncodeContext, x)
2957 #define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
2958 static const AVOption options
[] = {
2959 { "joint_stereo", "", OFFSET(joint
), AV_OPT_TYPE_BOOL
, {.i64
=-1}, -1, 1, FLAGS
},
2960 { "optimize_mono", "", OFFSET(optimize_mono
), AV_OPT_TYPE_BOOL
, {.i64
=0}, 0, 1, FLAGS
},
2964 static const AVClass wavpack_encoder_class
= {
2965 .class_name
= "WavPack encoder",
2966 .item_name
= av_default_item_name
,
2968 .version
= LIBAVUTIL_VERSION_INT
,
2971 const FFCodec ff_wavpack_encoder
= {
2972 .p
.name
= "wavpack",
2973 CODEC_LONG_NAME("WavPack"),
2974 .p
.type
= AVMEDIA_TYPE_AUDIO
,
2975 .p
.id
= AV_CODEC_ID_WAVPACK
,
2976 .p
.capabilities
= AV_CODEC_CAP_DR1
| AV_CODEC_CAP_SMALL_LAST_FRAME
|
2977 AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
,
2978 .priv_data_size
= sizeof(WavPackEncodeContext
),
2979 .p
.priv_class
= &wavpack_encoder_class
,
2980 .init
= wavpack_encode_init
,
2981 FF_CODEC_ENCODE_CB(wavpack_encode_frame
),
2982 .close
= wavpack_encode_close
,
2983 .p
.sample_fmts
= (const enum AVSampleFormat
[]){ AV_SAMPLE_FMT_U8P
,
2987 AV_SAMPLE_FMT_NONE
},