FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/wavpack.c
Date: 2024-12-12 01:08:13
Exec Total Coverage
Lines: 802 1067 75.2%
Functions: 19 24 79.2%
Branches: 496 708 70.1%

Line Branch Exec Source
1 /*
2 * WavPack lossless audio decoder
3 * Copyright (c) 2006,2011 Konstantin Shishkov
4 * Copyright (c) 2020 David Bryant
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/mem.h"
25
26 #define BITSTREAM_READER_LE
27 #include "avcodec.h"
28 #include "bytestream.h"
29 #include "codec_internal.h"
30 #include "get_bits.h"
31 #include "refstruct.h"
32 #include "thread.h"
33 #include "threadprogress.h"
34 #include "unary.h"
35 #include "wavpack.h"
36 #include "dsd.h"
37
38 /**
39 * @file
40 * WavPack lossless audio decoder
41 */
42
43 #define DSD_BYTE_READY(low,high) (!(((low) ^ (high)) & 0xff000000))
44
45 #define PTABLE_BITS 8
46 #define PTABLE_BINS (1<<PTABLE_BITS)
47 #define PTABLE_MASK (PTABLE_BINS-1)
48
49 #define UP 0x010000fe
50 #define DOWN 0x00010000
51 #define DECAY 8
52
53 #define PRECISION 20
54 #define VALUE_ONE (1 << PRECISION)
55 #define PRECISION_USE 12
56
57 #define RATE_S 20
58
59 #define MAX_HISTORY_BITS 5
60 #define MAX_HISTORY_BINS (1 << MAX_HISTORY_BITS)
61 #define MAX_BIN_BYTES 1280 // for value_lookup, per bin (2k - 512 - 256)
62
63 typedef enum {
64 MODULATION_PCM, // pulse code modulation
65 MODULATION_DSD // pulse density modulation (aka DSD)
66 } Modulation;
67
68 typedef struct WavpackFrameContext {
69 AVCodecContext *avctx;
70 int frame_flags;
71 int stereo, stereo_in;
72 int joint;
73 uint32_t CRC;
74 GetBitContext gb;
75 int got_extra_bits;
76 uint32_t crc_extra_bits;
77 GetBitContext gb_extra_bits;
78 int samples;
79 int terms;
80 Decorr decorr[MAX_TERMS];
81 int zero, one, zeroes;
82 int extra_bits;
83 int and, or, shift;
84 int post_shift;
85 int hybrid, hybrid_bitrate;
86 int hybrid_maxclip, hybrid_minclip;
87 int float_flag;
88 int float_shift;
89 int float_max_exp;
90 WvChannel ch[2];
91
92 GetByteContext gbyte;
93 int ptable [PTABLE_BINS];
94 uint8_t value_lookup_buffer[MAX_HISTORY_BINS*MAX_BIN_BYTES];
95 uint16_t summed_probabilities[MAX_HISTORY_BINS][256];
96 uint8_t probabilities[MAX_HISTORY_BINS][256];
97 uint8_t *value_lookup[MAX_HISTORY_BINS];
98 } WavpackFrameContext;
99
100 typedef struct WavpackContext {
101 AVCodecContext *avctx;
102
103 WavpackFrameContext **fdec;
104 int fdec_num;
105
106 int samples;
107 int ch_offset;
108
109 Modulation modulation;
110
111 DSDContext *dsdctx; ///< RefStruct reference
112 ThreadProgress *curr_progress, *prev_progress; ///< RefStruct references
113 FFRefStructPool *progress_pool; ///< RefStruct reference
114 int dsd_channels;
115 } WavpackContext;
116
117 #define LEVEL_DECAY(a) (((a) + 0x80) >> 8)
118
119 28282042 static av_always_inline unsigned get_tail(GetBitContext *gb, unsigned k)
120 {
121 int p, e, res;
122
123
2/2
✓ Branch 0 taken 3083218 times.
✓ Branch 1 taken 25198824 times.
28282042 if (k < 1)
124 3083218 return 0;
125 25198824 p = av_log2(k);
126 25198824 e = (1LL << (p + 1)) - k - 1;
127 25198824 res = get_bits_long(gb, p);
128
2/2
✓ Branch 0 taken 15873859 times.
✓ Branch 1 taken 9324965 times.
25198824 if (res >= e)
129 15873859 res = res * 2U - e + get_bits1(gb);
130 25198824 return res;
131 }
132
133 34605992 static int update_error_limit(WavpackFrameContext *ctx)
134 {
135 int i, br[2], sl[2];
136
137
2/2
✓ Branch 0 taken 59875526 times.
✓ Branch 1 taken 34605992 times.
94481518 for (i = 0; i <= ctx->stereo_in; i++) {
138
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 59875526 times.
59875526 if (ctx->ch[i].bitrate_acc > UINT_MAX - ctx->ch[i].bitrate_delta)
139 return AVERROR_INVALIDDATA;
140 59875526 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
141 59875526 br[i] = ctx->ch[i].bitrate_acc >> 16;
142 59875526 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
143 }
144
3/4
✓ Branch 0 taken 25269534 times.
✓ Branch 1 taken 9336458 times.
✓ Branch 2 taken 25269534 times.
✗ Branch 3 not taken.
34605992 if (ctx->stereo_in && ctx->hybrid_bitrate) {
145 25269534 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
146
2/2
✓ Branch 0 taken 7996128 times.
✓ Branch 1 taken 17273406 times.
25269534 if (balance > br[0]) {
147 7996128 br[1] = br[0] * 2;
148 7996128 br[0] = 0;
149
2/2
✓ Branch 0 taken 2254389 times.
✓ Branch 1 taken 15019017 times.
17273406 } else if (-balance > br[0]) {
150 2254389 br[0] *= 2;
151 2254389 br[1] = 0;
152 } else {
153 15019017 br[1] = br[0] + balance;
154 15019017 br[0] = br[0] - balance;
155 }
156 }
157
2/2
✓ Branch 0 taken 59875526 times.
✓ Branch 1 taken 34605992 times.
94481518 for (i = 0; i <= ctx->stereo_in; i++) {
158
1/2
✓ Branch 0 taken 59875526 times.
✗ Branch 1 not taken.
59875526 if (ctx->hybrid_bitrate) {
159
2/2
✓ Branch 0 taken 59872999 times.
✓ Branch 1 taken 2527 times.
59875526 if (sl[i] - br[i] > -0x100)
160 59872999 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
161 else
162 2527 ctx->ch[i].error_limit = 0;
163 } else {
164 ctx->ch[i].error_limit = wp_exp2(br[i]);
165 }
166 }
167
168 34605992 return 0;
169 }
170
171 350742057 static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
172 int channel, int *last)
173 {
174 int t, t2;
175 int sign, base, add, ret;
176 350742057 WvChannel *c = &ctx->ch[channel];
177
178 350742057 *last = 0;
179
180
4/4
✓ Branch 0 taken 264715557 times.
✓ Branch 1 taken 86026500 times.
✓ Branch 2 taken 264014532 times.
✓ Branch 3 taken 701025 times.
350742057 if ((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) &&
181
4/4
✓ Branch 0 taken 263853453 times.
✓ Branch 1 taken 161079 times.
✓ Branch 2 taken 263810815 times.
✓ Branch 3 taken 42638 times.
264014532 !ctx->zero && !ctx->one) {
182
2/2
✓ Branch 0 taken 263606534 times.
✓ Branch 1 taken 204281 times.
263810815 if (ctx->zeroes) {
183 263606534 ctx->zeroes--;
184
2/2
✓ Branch 0 taken 263501545 times.
✓ Branch 1 taken 104989 times.
263606534 if (ctx->zeroes) {
185 263501545 c->slow_level -= LEVEL_DECAY(c->slow_level);
186 263501545 return 0;
187 }
188 } else {
189 204281 t = get_unary_0_33(gb);
190
2/2
✓ Branch 0 taken 70185 times.
✓ Branch 1 taken 134096 times.
204281 if (t >= 2) {
191
2/4
✓ Branch 0 taken 70185 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 70185 times.
70185 if (t >= 32 || get_bits_left(gb) < t - 1)
192 goto error;
193 70185 t = get_bits_long(gb, t - 1) | (1 << (t - 1));
194 } else {
195
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 134096 times.
134096 if (get_bits_left(gb) < 0)
196 goto error;
197 }
198 204281 ctx->zeroes = t;
199
2/2
✓ Branch 0 taken 111012 times.
✓ Branch 1 taken 93269 times.
204281 if (ctx->zeroes) {
200 111012 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
201 111012 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
202 111012 c->slow_level -= LEVEL_DECAY(c->slow_level);
203 111012 return 0;
204 }
205 }
206 }
207
208
2/2
✓ Branch 0 taken 36018736 times.
✓ Branch 1 taken 51110764 times.
87129500 if (ctx->zero) {
209 36018736 t = 0;
210 36018736 ctx->zero = 0;
211 } else {
212 51110764 t = get_unary_0_33(gb);
213
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 51110764 times.
51110764 if (get_bits_left(gb) < 0)
214 goto error;
215
2/2
✓ Branch 0 taken 20139 times.
✓ Branch 1 taken 51090625 times.
51110764 if (t == 16) {
216 20139 t2 = get_unary_0_33(gb);
217
2/2
✓ Branch 0 taken 4854 times.
✓ Branch 1 taken 15285 times.
20139 if (t2 < 2) {
218
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4854 times.
4854 if (get_bits_left(gb) < 0)
219 goto error;
220 4854 t += t2;
221 } else {
222
2/4
✓ Branch 0 taken 15285 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 15285 times.
15285 if (t2 >= 32 || get_bits_left(gb) < t2 - 1)
223 goto error;
224 15285 t += get_bits_long(gb, t2 - 1) | (1 << (t2 - 1));
225 }
226 }
227
228
2/2
✓ Branch 0 taken 15090662 times.
✓ Branch 1 taken 36020102 times.
51110764 if (ctx->one) {
229 15090662 ctx->one = t & 1;
230 15090662 t = (t >> 1) + 1;
231 } else {
232 36020102 ctx->one = t & 1;
233 36020102 t >>= 1;
234 }
235 51110764 ctx->zero = !ctx->one;
236 }
237
238
4/4
✓ Branch 0 taken 59874831 times.
✓ Branch 1 taken 27254669 times.
✓ Branch 2 taken 34605992 times.
✓ Branch 3 taken 25268839 times.
87129500 if (ctx->hybrid && !channel) {
239
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 34605992 times.
34605992 if (update_error_limit(ctx) < 0)
240 goto error;
241 }
242
243
2/2
✓ Branch 0 taken 62106315 times.
✓ Branch 1 taken 25023185 times.
87129500 if (!t) {
244 62106315 base = 0;
245 62106315 add = GET_MED(0) - 1;
246 62106315 DEC_MED(0);
247
2/2
✓ Branch 0 taken 17844678 times.
✓ Branch 1 taken 7178507 times.
25023185 } else if (t == 1) {
248 17844678 base = GET_MED(0);
249 17844678 add = GET_MED(1) - 1;
250 17844678 INC_MED(0);
251 17844678 DEC_MED(1);
252
2/2
✓ Branch 0 taken 5062511 times.
✓ Branch 1 taken 2115996 times.
7178507 } else if (t == 2) {
253 5062511 base = GET_MED(0) + GET_MED(1);
254 5062511 add = GET_MED(2) - 1;
255 5062511 INC_MED(0);
256 5062511 INC_MED(1);
257 5062511 DEC_MED(2);
258 } else {
259 2115996 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2U);
260 2115996 add = GET_MED(2) - 1;
261 2115996 INC_MED(0);
262 2115996 INC_MED(1);
263 2115996 INC_MED(2);
264 }
265
2/2
✓ Branch 0 taken 28282042 times.
✓ Branch 1 taken 58847458 times.
87129500 if (!c->error_limit) {
266 28282042 ret = base + get_tail(gb, add);
267
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 28282042 times.
28282042 if (get_bits_left(gb) <= 0)
268 goto error;
269 } else {
270 58847458 int mid = (base * 2U + add + 1) >> 1;
271
2/2
✓ Branch 0 taken 25419273 times.
✓ Branch 1 taken 58847458 times.
84266731 while (add > c->error_limit) {
272
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 25419273 times.
25419273 if (get_bits_left(gb) <= 0)
273 goto error;
274
2/2
✓ Branch 1 taken 10905078 times.
✓ Branch 2 taken 14514195 times.
25419273 if (get_bits1(gb)) {
275 10905078 add -= (mid - (unsigned)base);
276 10905078 base = mid;
277 } else
278 14514195 add = mid - (unsigned)base - 1;
279 25419273 mid = (base * 2U + add + 1) >> 1;
280 }
281 58847458 ret = mid;
282 }
283 87129500 sign = get_bits1(gb);
284
2/2
✓ Branch 0 taken 59874831 times.
✓ Branch 1 taken 27254669 times.
87129500 if (ctx->hybrid_bitrate)
285 59874831 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
286
2/2
✓ Branch 0 taken 40808659 times.
✓ Branch 1 taken 46320841 times.
87129500 return sign ? ~ret : ret;
287
288 error:
289 ret = get_bits_left(gb);
290 if (ret <= 0) {
291 av_log(ctx->avctx, AV_LOG_ERROR, "Too few bits (%d) left\n", ret);
292 }
293 *last = 1;
294 return 0;
295 }
296
297 347567571 static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
298 unsigned S)
299 {
300 unsigned bit;
301
302
2/2
✓ Branch 0 taken 352800 times.
✓ Branch 1 taken 347214771 times.
347567571 if (s->extra_bits) {
303 352800 S *= 1 << s->extra_bits;
304
305
1/2
✓ Branch 0 taken 352800 times.
✗ Branch 1 not taken.
352800 if (s->got_extra_bits &&
306
1/2
✓ Branch 1 taken 352800 times.
✗ Branch 2 not taken.
352800 get_bits_left(&s->gb_extra_bits) >= s->extra_bits) {
307 352800 S |= get_bits_long(&s->gb_extra_bits, s->extra_bits);
308 352800 *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
309 }
310 }
311
312 347567571 bit = (S & s->and) | s->or;
313 347567571 bit = ((S + bit) << s->shift) - bit;
314
315
2/2
✓ Branch 0 taken 320210656 times.
✓ Branch 1 taken 27356915 times.
347567571 if (s->hybrid)
316 320210656 bit = av_clip(bit, s->hybrid_minclip, s->hybrid_maxclip);
317
318 347567571 return bit << s->post_shift;
319 }
320
321 3174484 static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
322 {
323 union {
324 float f;
325 uint32_t u;
326 } value;
327
328 unsigned int sign;
329 3174484 int exp = s->float_max_exp;
330
331
2/2
✓ Branch 0 taken 828900 times.
✓ Branch 1 taken 2345584 times.
3174484 if (s->got_extra_bits) {
332 828900 const int max_bits = 1 + 23 + 8 + 1;
333 828900 const int left_bits = get_bits_left(&s->gb_extra_bits);
334
335
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 828900 times.
828900 if (left_bits + 8 * AV_INPUT_BUFFER_PADDING_SIZE < max_bits)
336 return 0.0;
337 }
338
339
2/2
✓ Branch 0 taken 3174479 times.
✓ Branch 1 taken 5 times.
3174484 if (S) {
340 3174479 S *= 1U << s->float_shift;
341 3174479 sign = S < 0;
342
2/2
✓ Branch 0 taken 1588502 times.
✓ Branch 1 taken 1585977 times.
3174479 if (sign)
343 1588502 S = -(unsigned)S;
344
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3174479 times.
3174479 if (S >= 0x1000000U) {
345 if (s->got_extra_bits && get_bits1(&s->gb_extra_bits))
346 S = get_bits(&s->gb_extra_bits, 23);
347 else
348 S = 0;
349 exp = 255;
350
1/2
✓ Branch 0 taken 3174479 times.
✗ Branch 1 not taken.
3174479 } else if (exp) {
351 3174479 int shift = 23 - av_log2(S);
352 3174479 exp = s->float_max_exp;
353
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3174479 times.
3174479 if (exp <= shift)
354 shift = --exp;
355 3174479 exp -= shift;
356
357
2/2
✓ Branch 0 taken 3130357 times.
✓ Branch 1 taken 44122 times.
3174479 if (shift) {
358 3130357 S <<= shift;
359
1/2
✓ Branch 0 taken 3130357 times.
✗ Branch 1 not taken.
3130357 if ((s->float_flag & WV_FLT_SHIFT_ONES) ||
360
2/2
✓ Branch 0 taken 817921 times.
✓ Branch 1 taken 2312436 times.
3130357 (s->got_extra_bits &&
361
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 817921 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
817921 (s->float_flag & WV_FLT_SHIFT_SAME) &&
362 get_bits1(&s->gb_extra_bits))) {
363 S |= (1 << shift) - 1;
364
2/2
✓ Branch 0 taken 817921 times.
✓ Branch 1 taken 2312436 times.
3130357 } else if (s->got_extra_bits &&
365
1/2
✓ Branch 0 taken 817921 times.
✗ Branch 1 not taken.
817921 (s->float_flag & WV_FLT_SHIFT_SENT)) {
366 817921 S |= get_bits(&s->gb_extra_bits, shift);
367 }
368 }
369 } else {
370 exp = s->float_max_exp;
371 }
372 3174479 S &= 0x7fffff;
373 } else {
374 5 sign = 0;
375 5 exp = 0;
376
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
5 if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) {
377
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 if (get_bits1(&s->gb_extra_bits)) {
378 2 S = get_bits(&s->gb_extra_bits, 23);
379
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (s->float_max_exp >= 25)
380 2 exp = get_bits(&s->gb_extra_bits, 8);
381 2 sign = get_bits1(&s->gb_extra_bits);
382 } else {
383 if (s->float_flag & WV_FLT_ZERO_SIGN)
384 sign = get_bits1(&s->gb_extra_bits);
385 }
386 }
387 }
388
389 3174484 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
390
391 3174484 value.u = (sign << 31) | (exp << 23) | S;
392 3174484 return value.f;
393 }
394
395 81 static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
396 uint32_t crc_extra_bits)
397 {
398
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
81 if (crc != s->CRC) {
399 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
400 return AVERROR_INVALIDDATA;
401 }
402
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
81 if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) {
403 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
404 return AVERROR_INVALIDDATA;
405 }
406
407 81 return 0;
408 }
409
410 52 static void init_ptable(int *table, int rate_i, int rate_s)
411 {
412 52 int value = 0x808000, rate = rate_i << 8;
413
414
2/2
✓ Branch 0 taken 603 times.
✓ Branch 1 taken 52 times.
655 for (int c = (rate + 128) >> 8; c--;)
415 603 value += (DOWN - value) >> DECAY;
416
417
2/2
✓ Branch 0 taken 6656 times.
✓ Branch 1 taken 52 times.
6708 for (int i = 0; i < PTABLE_BINS/2; i++) {
418 6656 table[i] = value;
419 6656 table[PTABLE_BINS-1-i] = 0x100ffff - value;
420
421
2/2
✓ Branch 0 taken 1589 times.
✓ Branch 1 taken 5067 times.
6656 if (value > 0x010000) {
422 1589 rate += (rate * rate_s + 128) >> 8;
423
424
2/2
✓ Branch 0 taken 147854 times.
✓ Branch 1 taken 1589 times.
149443 for (int c = (rate + 64) >> 7; c--;)
425 147854 value += (DOWN - value) >> DECAY;
426 }
427 }
428 52 }
429
430 typedef struct {
431 int32_t value, fltr0, fltr1, fltr2, fltr3, fltr4, fltr5, fltr6, factor;
432 unsigned int byte;
433 } DSDfilters;
434
435 52 static int wv_unpack_dsd_high(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
436 {
437 52 uint32_t checksum = 0xFFFFFFFF;
438 52 uint8_t *dst_l = dst_left, *dst_r = dst_right;
439 52 int total_samples = s->samples, stereo = dst_r ? 1 : 0;
440 52 DSDfilters filters[2], *sp = filters;
441 int rate_i, rate_s;
442 uint32_t low, high, value;
443
444
2/4
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 52 times.
52 if (bytestream2_get_bytes_left(&s->gbyte) < (stereo ? 20 : 13))
445 return AVERROR_INVALIDDATA;
446
447 52 rate_i = bytestream2_get_byte(&s->gbyte);
448 52 rate_s = bytestream2_get_byte(&s->gbyte);
449
450
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 52 times.
52 if (rate_s != RATE_S)
451 return AVERROR_INVALIDDATA;
452
453 52 init_ptable(s->ptable, rate_i, rate_s);
454
455
2/2
✓ Branch 0 taken 104 times.
✓ Branch 1 taken 52 times.
156 for (int channel = 0; channel < stereo + 1; channel++) {
456 104 DSDfilters *sp = filters + channel;
457
458 104 sp->fltr1 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
459 104 sp->fltr2 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
460 104 sp->fltr3 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
461 104 sp->fltr4 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
462 104 sp->fltr5 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
463 104 sp->fltr6 = 0;
464 104 sp->factor = bytestream2_get_byte(&s->gbyte) & 0xff;
465 104 sp->factor |= (bytestream2_get_byte(&s->gbyte) << 8) & 0xff00;
466 104 sp->factor = (int32_t)((uint32_t)sp->factor << 16) >> 16;
467 }
468
469 52 value = bytestream2_get_be32(&s->gbyte);
470 52 high = 0xffffffff;
471 52 low = 0x0;
472
473
2/2
✓ Branch 0 taken 1146600 times.
✓ Branch 1 taken 52 times.
1146652 while (total_samples--) {
474 1146600 int bitcount = 8;
475
476 1146600 sp[0].value = sp[0].fltr1 - sp[0].fltr5 + ((sp[0].fltr6 * sp[0].factor) >> 2);
477
478
1/2
✓ Branch 0 taken 1146600 times.
✗ Branch 1 not taken.
1146600 if (stereo)
479 1146600 sp[1].value = sp[1].fltr1 - sp[1].fltr5 + ((sp[1].fltr6 * sp[1].factor) >> 2);
480
481
2/2
✓ Branch 0 taken 9172800 times.
✓ Branch 1 taken 1146600 times.
10319400 while (bitcount--) {
482 9172800 int32_t *pp = s->ptable + ((sp[0].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK);
483 9172800 uint32_t split = low + ((high - low) >> 8) * (*pp >> 16);
484
485
2/2
✓ Branch 0 taken 4587355 times.
✓ Branch 1 taken 4585445 times.
9172800 if (value <= split) {
486 4587355 high = split;
487 4587355 *pp += (UP - *pp) >> DECAY;
488 4587355 sp[0].fltr0 = -1;
489 } else {
490 4585445 low = split + 1;
491 4585445 *pp += (DOWN - *pp) >> DECAY;
492 4585445 sp[0].fltr0 = 0;
493 }
494
495
3/4
✓ Branch 0 taken 386807 times.
✓ Branch 1 taken 8785993 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 386807 times.
9172800 if (DSD_BYTE_READY(high, low) && !bytestream2_get_bytes_left(&s->gbyte))
496 return AVERROR_INVALIDDATA;
497
3/4
✓ Branch 0 taken 389530 times.
✓ Branch 1 taken 9172800 times.
✓ Branch 3 taken 389530 times.
✗ Branch 4 not taken.
9562330 while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
498 389530 value = (value << 8) | bytestream2_get_byte(&s->gbyte);
499 389530 high = (high << 8) | 0xff;
500 389530 low <<= 8;
501 }
502
503 9172800 sp[0].value += sp[0].fltr6 * 8;
504 9172800 sp[0].byte = (sp[0].byte << 1) | (sp[0].fltr0 & 1);
505 9172800 sp[0].factor += (((sp[0].value ^ sp[0].fltr0) >> 31) | 1) &
506 9172800 ((sp[0].value ^ (sp[0].value - (sp[0].fltr6 * 16))) >> 31);
507 9172800 sp[0].fltr1 += ((sp[0].fltr0 & VALUE_ONE) - sp[0].fltr1) >> 6;
508 9172800 sp[0].fltr2 += ((sp[0].fltr0 & VALUE_ONE) - sp[0].fltr2) >> 4;
509 9172800 sp[0].fltr3 += (sp[0].fltr2 - sp[0].fltr3) >> 4;
510 9172800 sp[0].fltr4 += (sp[0].fltr3 - sp[0].fltr4) >> 4;
511 9172800 sp[0].value = (sp[0].fltr4 - sp[0].fltr5) >> 4;
512 9172800 sp[0].fltr5 += sp[0].value;
513 9172800 sp[0].fltr6 += (sp[0].value - sp[0].fltr6) >> 3;
514 9172800 sp[0].value = sp[0].fltr1 - sp[0].fltr5 + ((sp[0].fltr6 * sp[0].factor) >> 2);
515
516
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9172800 times.
9172800 if (!stereo)
517 continue;
518
519 9172800 pp = s->ptable + ((sp[1].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK);
520 9172800 split = low + ((high - low) >> 8) * (*pp >> 16);
521
522
2/2
✓ Branch 0 taken 4587014 times.
✓ Branch 1 taken 4585786 times.
9172800 if (value <= split) {
523 4587014 high = split;
524 4587014 *pp += (UP - *pp) >> DECAY;
525 4587014 sp[1].fltr0 = -1;
526 } else {
527 4585786 low = split + 1;
528 4585786 *pp += (DOWN - *pp) >> DECAY;
529 4585786 sp[1].fltr0 = 0;
530 }
531
532
3/4
✓ Branch 0 taken 393770 times.
✓ Branch 1 taken 8779030 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 393770 times.
9172800 if (DSD_BYTE_READY(high, low) && !bytestream2_get_bytes_left(&s->gbyte))
533 return AVERROR_INVALIDDATA;
534
3/4
✓ Branch 0 taken 396567 times.
✓ Branch 1 taken 9172800 times.
✓ Branch 3 taken 396567 times.
✗ Branch 4 not taken.
9569367 while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
535 396567 value = (value << 8) | bytestream2_get_byte(&s->gbyte);
536 396567 high = (high << 8) | 0xff;
537 396567 low <<= 8;
538 }
539
540 9172800 sp[1].value += sp[1].fltr6 * 8;
541 9172800 sp[1].byte = (sp[1].byte << 1) | (sp[1].fltr0 & 1);
542 9172800 sp[1].factor += (((sp[1].value ^ sp[1].fltr0) >> 31) | 1) &
543 9172800 ((sp[1].value ^ (sp[1].value - (sp[1].fltr6 * 16))) >> 31);
544 9172800 sp[1].fltr1 += ((sp[1].fltr0 & VALUE_ONE) - sp[1].fltr1) >> 6;
545 9172800 sp[1].fltr2 += ((sp[1].fltr0 & VALUE_ONE) - sp[1].fltr2) >> 4;
546 9172800 sp[1].fltr3 += (sp[1].fltr2 - sp[1].fltr3) >> 4;
547 9172800 sp[1].fltr4 += (sp[1].fltr3 - sp[1].fltr4) >> 4;
548 9172800 sp[1].value = (sp[1].fltr4 - sp[1].fltr5) >> 4;
549 9172800 sp[1].fltr5 += sp[1].value;
550 9172800 sp[1].fltr6 += (sp[1].value - sp[1].fltr6) >> 3;
551 9172800 sp[1].value = sp[1].fltr1 - sp[1].fltr5 + ((sp[1].fltr6 * sp[1].factor) >> 2);
552 }
553
554 1146600 checksum += (checksum << 1) + (*dst_l = sp[0].byte & 0xff);
555 1146600 sp[0].factor -= (sp[0].factor + 512) >> 10;
556 1146600 dst_l += 4;
557
558
1/2
✓ Branch 0 taken 1146600 times.
✗ Branch 1 not taken.
1146600 if (stereo) {
559 1146600 checksum += (checksum << 1) + (*dst_r = filters[1].byte & 0xff);
560 1146600 filters[1].factor -= (filters[1].factor + 512) >> 10;
561 1146600 dst_r += 4;
562 }
563 }
564
565
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 52 times.
52 if (wv_check_crc(s, checksum, 0)) {
566 if (s->avctx->err_recognition & AV_EF_CRCCHECK)
567 return AVERROR_INVALIDDATA;
568
569 memset(dst_left, 0x69, s->samples * 4);
570
571 if (dst_r)
572 memset(dst_right, 0x69, s->samples * 4);
573 }
574
575 52 return 0;
576 }
577
578 15 static int wv_unpack_dsd_fast(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
579 {
580 15 uint8_t *dst_l = dst_left, *dst_r = dst_right;
581 uint8_t history_bits, max_probability;
582 15 int total_summed_probabilities = 0;
583 15 int total_samples = s->samples;
584 15 uint8_t *vlb = s->value_lookup_buffer;
585 int history_bins, p0, p1, chan;
586 15 uint32_t checksum = 0xFFFFFFFF;
587 uint32_t low, high, value;
588
589
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
15 if (!bytestream2_get_bytes_left(&s->gbyte))
590 return AVERROR_INVALIDDATA;
591
592 15 history_bits = bytestream2_get_byte(&s->gbyte);
593
594
2/4
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
15 if (!bytestream2_get_bytes_left(&s->gbyte) || history_bits > MAX_HISTORY_BITS)
595 return AVERROR_INVALIDDATA;
596
597 15 history_bins = 1 << history_bits;
598 15 max_probability = bytestream2_get_byte(&s->gbyte);
599
600
1/2
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
15 if (max_probability < 0xff) {
601 15 uint8_t *outptr = (uint8_t *)s->probabilities;
602 15 uint8_t *outend = outptr + sizeof(*s->probabilities) * history_bins;
603
604
3/4
✓ Branch 0 taken 10269 times.
✓ Branch 1 taken 15 times.
✓ Branch 3 taken 10269 times.
✗ Branch 4 not taken.
10284 while (outptr < outend && bytestream2_get_bytes_left(&s->gbyte)) {
605 10269 int code = bytestream2_get_byte(&s->gbyte);
606
607
2/2
✓ Branch 0 taken 3428 times.
✓ Branch 1 taken 6841 times.
10269 if (code > max_probability) {
608 3428 int zcount = code - max_probability;
609
610
4/4
✓ Branch 0 taken 119452 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 116039 times.
✓ Branch 3 taken 3413 times.
119467 while (outptr < outend && zcount--)
611 116039 *outptr++ = 0;
612
1/2
✓ Branch 0 taken 6841 times.
✗ Branch 1 not taken.
6841 } else if (code) {
613 6841 *outptr++ = code;
614 }
615 else {
616 break;
617 }
618 }
619
620
2/4
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
30 if (outptr < outend ||
621
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
30 (bytestream2_get_bytes_left(&s->gbyte) && bytestream2_get_byte(&s->gbyte)))
622 return AVERROR_INVALIDDATA;
623 } else if (bytestream2_get_bytes_left(&s->gbyte) > (int)sizeof(*s->probabilities) * history_bins) {
624 bytestream2_get_buffer(&s->gbyte, (uint8_t *)s->probabilities,
625 sizeof(*s->probabilities) * history_bins);
626 } else {
627 return AVERROR_INVALIDDATA;
628 }
629
630
2/2
✓ Branch 0 taken 480 times.
✓ Branch 1 taken 15 times.
495 for (p0 = 0; p0 < history_bins; p0++) {
631 480 int32_t sum_values = 0;
632
633
2/2
✓ Branch 0 taken 122880 times.
✓ Branch 1 taken 480 times.
123360 for (int i = 0; i < 256; i++)
634 122880 s->summed_probabilities[p0][i] = sum_values += s->probabilities[p0][i];
635
636
2/2
✓ Branch 0 taken 344 times.
✓ Branch 1 taken 136 times.
480 if (sum_values) {
637 344 total_summed_probabilities += sum_values;
638
639
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 344 times.
344 if (total_summed_probabilities > history_bins * MAX_BIN_BYTES)
640 return AVERROR_INVALIDDATA;
641
642 344 s->value_lookup[p0] = vlb;
643
644
2/2
✓ Branch 0 taken 88064 times.
✓ Branch 1 taken 344 times.
88408 for (int i = 0; i < 256; i++) {
645 88064 int c = s->probabilities[p0][i];
646
647
2/2
✓ Branch 0 taken 125254 times.
✓ Branch 1 taken 88064 times.
213318 while (c--)
648 125254 *vlb++ = i;
649 }
650 }
651 }
652
653
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
15 if (bytestream2_get_bytes_left(&s->gbyte) < 4)
654 return AVERROR_INVALIDDATA;
655
656 15 chan = p0 = p1 = 0;
657 15 low = 0; high = 0xffffffff;
658 15 value = bytestream2_get_be32(&s->gbyte);
659
660
1/2
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
15 if (dst_r)
661 15 total_samples *= 2;
662
663
2/2
✓ Branch 0 taken 661500 times.
✓ Branch 1 taken 15 times.
661515 while (total_samples--) {
664 unsigned int mult, index, code;
665
666
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 661500 times.
661500 if (!s->summed_probabilities[p0][255])
667 return AVERROR_INVALIDDATA;
668
669 661500 mult = (high - low) / s->summed_probabilities[p0][255];
670
671
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 661495 times.
661500 if (!mult) {
672
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 if (bytestream2_get_bytes_left(&s->gbyte) >= 4)
673 5 value = bytestream2_get_be32(&s->gbyte);
674
675 5 low = 0;
676 5 high = 0xffffffff;
677 5 mult = high / s->summed_probabilities[p0][255];
678
679
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 if (!mult)
680 return AVERROR_INVALIDDATA;
681 }
682
683 661500 index = (value - low) / mult;
684
685
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 661500 times.
661500 if (index >= s->summed_probabilities[p0][255])
686 return AVERROR_INVALIDDATA;
687
688
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 661500 times.
661500 if (!dst_r) {
689 if ((*dst_l = code = s->value_lookup[p0][index]))
690 low += s->summed_probabilities[p0][code-1] * mult;
691
692 dst_l += 4;
693 } else {
694
1/2
✓ Branch 0 taken 661500 times.
✗ Branch 1 not taken.
661500 if ((code = s->value_lookup[p0][index]))
695 661500 low += s->summed_probabilities[p0][code-1] * mult;
696
697
2/2
✓ Branch 0 taken 330750 times.
✓ Branch 1 taken 330750 times.
661500 if (chan) {
698 330750 *dst_r = code;
699 330750 dst_r += 4;
700 }
701 else {
702 330750 *dst_l = code;
703 330750 dst_l += 4;
704 }
705
706 661500 chan ^= 1;
707 }
708
709 661500 high = low + s->probabilities[p0][code] * mult - 1;
710 661500 checksum += (checksum << 1) + code;
711
712
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 661500 times.
661500 if (!dst_r) {
713 p0 = code & (history_bins-1);
714 } else {
715 661500 p0 = p1;
716 661500 p1 = code & (history_bins-1);
717 }
718
719
3/4
✓ Branch 0 taken 325635 times.
✓ Branch 1 taken 661500 times.
✓ Branch 3 taken 325635 times.
✗ Branch 4 not taken.
987135 while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
720 325635 value = (value << 8) | bytestream2_get_byte(&s->gbyte);
721 325635 high = (high << 8) | 0xff;
722 325635 low <<= 8;
723 }
724 }
725
726
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
15 if (wv_check_crc(s, checksum, 0)) {
727 if (s->avctx->err_recognition & AV_EF_CRCCHECK)
728 return AVERROR_INVALIDDATA;
729
730 memset(dst_left, 0x69, s->samples * 4);
731
732 if (dst_r)
733 memset(dst_right, 0x69, s->samples * 4);
734 }
735
736 15 return 0;
737 }
738
739 14 static int wv_unpack_dsd_copy(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
740 {
741 14 uint8_t *dst_l = dst_left, *dst_r = dst_right;
742 14 int total_samples = s->samples;
743 14 uint32_t checksum = 0xFFFFFFFF;
744
745
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 if (bytestream2_get_bytes_left(&s->gbyte) != total_samples * (dst_r ? 2 : 1))
746 return AVERROR_INVALIDDATA;
747
748
2/2
✓ Branch 0 taken 308700 times.
✓ Branch 1 taken 14 times.
308714 while (total_samples--) {
749 308700 checksum += (checksum << 1) + (*dst_l = bytestream2_get_byte(&s->gbyte));
750 308700 dst_l += 4;
751
752
1/2
✓ Branch 0 taken 308700 times.
✗ Branch 1 not taken.
308700 if (dst_r) {
753 308700 checksum += (checksum << 1) + (*dst_r = bytestream2_get_byte(&s->gbyte));
754 308700 dst_r += 4;
755 }
756 }
757
758
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
14 if (wv_check_crc(s, checksum, 0)) {
759 if (s->avctx->err_recognition & AV_EF_CRCCHECK)
760 return AVERROR_INVALIDDATA;
761
762 memset(dst_left, 0x69, s->samples * 4);
763
764 if (dst_r)
765 memset(dst_right, 0x69, s->samples * 4);
766 }
767
768 14 return 0;
769 }
770
771 7591 static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb,
772 void *dst_l, void *dst_r, const int type)
773 {
774 7591 int i, j, count = 0;
775 int last, t;
776 int A, B, L, L2, R, R2;
777 7591 int pos = 0;
778 7591 uint32_t crc = 0xFFFFFFFF;
779 7591 uint32_t crc_extra_bits = 0xFFFFFFFF;
780 7591 int16_t *dst16_l = dst_l;
781 7591 int16_t *dst16_r = dst_r;
782 7591 int32_t *dst32_l = dst_l;
783 7591 int32_t *dst32_r = dst_r;
784 7591 float *dstfl_l = dst_l;
785 7591 float *dstfl_r = dst_r;
786
787 7591 s->one = s->zero = s->zeroes = 0;
788 do {
789 167565348 L = wv_get_value(s, gb, 0, &last);
790
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 167565348 times.
167565348 if (last)
791 break;
792 167565348 R = wv_get_value(s, gb, 1, &last);
793
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 167565348 times.
167565348 if (last)
794 break;
795
2/2
✓ Branch 0 taken 874059500 times.
✓ Branch 1 taken 167565348 times.
1041624848 for (i = 0; i < s->terms; i++) {
796 874059500 Decorr *decorr = &s->decorr[i];
797
798 874059500 t = decorr->value;
799
2/2
✓ Branch 0 taken 857319428 times.
✓ Branch 1 taken 16740072 times.
874059500 if (t > 0) {
800
2/2
✓ Branch 0 taken 486097630 times.
✓ Branch 1 taken 371221798 times.
857319428 if (t > 8) {
801
2/2
✓ Branch 0 taken 157268390 times.
✓ Branch 1 taken 328829240 times.
486097630 if (t & 1) {
802 157268390 A = 2U * decorr->samplesA[0] - decorr->samplesA[1];
803 157268390 B = 2U * decorr->samplesB[0] - decorr->samplesB[1];
804 } else {
805 328829240 A = (int)(3U * decorr->samplesA[0] - decorr->samplesA[1]) >> 1;
806 328829240 B = (int)(3U * decorr->samplesB[0] - decorr->samplesB[1]) >> 1;
807 }
808 486097630 decorr->samplesA[1] = decorr->samplesA[0];
809 486097630 decorr->samplesB[1] = decorr->samplesB[0];
810 486097630 j = 0;
811 } else {
812 371221798 A = decorr->samplesA[pos];
813 371221798 B = decorr->samplesB[pos];
814 371221798 j = (pos + t) & 7;
815 }
816
2/2
✓ Branch 0 taken 21296280 times.
✓ Branch 1 taken 836023148 times.
857319428 if (type != AV_SAMPLE_FMT_S16P) {
817 21296280 L2 = L + ((decorr->weightA * (int64_t)A + 512) >> 10);
818 21296280 R2 = R + ((decorr->weightB * (int64_t)B + 512) >> 10);
819 } else {
820 836023148 L2 = L + (unsigned)((int)(decorr->weightA * (unsigned)A + 512) >> 10);
821 836023148 R2 = R + (unsigned)((int)(decorr->weightB * (unsigned)B + 512) >> 10);
822 }
823
4/4
✓ Branch 0 taken 194847390 times.
✓ Branch 1 taken 662472038 times.
✓ Branch 2 taken 189144006 times.
✓ Branch 3 taken 5703384 times.
857319428 if (A && L)
824 189144006 decorr->weightA -= ((((L ^ A) >> 30) & 2) - 1) * decorr->delta;
825
4/4
✓ Branch 0 taken 194201846 times.
✓ Branch 1 taken 663117582 times.
✓ Branch 2 taken 187155846 times.
✓ Branch 3 taken 7046000 times.
857319428 if (B && R)
826 187155846 decorr->weightB -= ((((R ^ B) >> 30) & 2) - 1) * decorr->delta;
827 857319428 decorr->samplesA[j] = L = L2;
828 857319428 decorr->samplesB[j] = R = R2;
829
2/2
✓ Branch 0 taken 3724236 times.
✓ Branch 1 taken 13015836 times.
16740072 } else if (t == -1) {
830
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3724236 times.
3724236 if (type != AV_SAMPLE_FMT_S16P)
831 L2 = L + ((decorr->weightA * (int64_t)decorr->samplesA[0] + 512) >> 10);
832 else
833 3724236 L2 = L + (unsigned)((int)(decorr->weightA * (unsigned)decorr->samplesA[0] + 512) >> 10);
834
9/10
✓ Branch 0 taken 3558418 times.
✓ Branch 1 taken 165818 times.
✓ Branch 2 taken 3424694 times.
✓ Branch 3 taken 133724 times.
✓ Branch 4 taken 1710424 times.
✓ Branch 5 taken 1714270 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1710424 times.
✓ Branch 8 taken 3 times.
✓ Branch 9 taken 1714267 times.
3724236 UPDATE_WEIGHT_CLIP(decorr->weightA, decorr->delta, decorr->samplesA[0], L);
835 3724236 L = L2;
836
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3724236 times.
3724236 if (type != AV_SAMPLE_FMT_S16P)
837 R2 = R + ((decorr->weightB * (int64_t)L2 + 512) >> 10);
838 else
839 3724236 R2 = R + (unsigned)((int)(decorr->weightB * (unsigned)L2 + 512) >> 10);
840
10/10
✓ Branch 0 taken 3577466 times.
✓ Branch 1 taken 146770 times.
✓ Branch 2 taken 3380796 times.
✓ Branch 3 taken 196670 times.
✓ Branch 4 taken 1681154 times.
✓ Branch 5 taken 1699642 times.
✓ Branch 6 taken 403 times.
✓ Branch 7 taken 1680751 times.
✓ Branch 8 taken 18293 times.
✓ Branch 9 taken 1681349 times.
3724236 UPDATE_WEIGHT_CLIP(decorr->weightB, decorr->delta, L2, R);
841 3724236 R = R2;
842 3724236 decorr->samplesA[0] = R;
843 } else {
844
2/2
✓ Branch 0 taken 815850 times.
✓ Branch 1 taken 12199986 times.
13015836 if (type != AV_SAMPLE_FMT_S16P)
845 815850 R2 = R + ((decorr->weightB * (int64_t)decorr->samplesB[0] + 512) >> 10);
846 else
847 12199986 R2 = R + (unsigned)((int)(decorr->weightB * (unsigned)decorr->samplesB[0] + 512) >> 10);
848
10/10
✓ Branch 0 taken 12113972 times.
✓ Branch 1 taken 901864 times.
✓ Branch 2 taken 11801283 times.
✓ Branch 3 taken 312689 times.
✓ Branch 4 taken 5912966 times.
✓ Branch 5 taken 5888317 times.
✓ Branch 6 taken 7735 times.
✓ Branch 7 taken 5905231 times.
✓ Branch 8 taken 427 times.
✓ Branch 9 taken 5887890 times.
13015836 UPDATE_WEIGHT_CLIP(decorr->weightB, decorr->delta, decorr->samplesB[0], R);
849 13015836 R = R2;
850
851
2/2
✓ Branch 0 taken 10657190 times.
✓ Branch 1 taken 2358646 times.
13015836 if (t == -3) {
852 10657190 R2 = decorr->samplesA[0];
853 10657190 decorr->samplesA[0] = R;
854 }
855
856
2/2
✓ Branch 0 taken 815850 times.
✓ Branch 1 taken 12199986 times.
13015836 if (type != AV_SAMPLE_FMT_S16P)
857 815850 L2 = L + ((decorr->weightA * (int64_t)R2 + 512) >> 10);
858 else
859 12199986 L2 = L + (unsigned)((int)(decorr->weightA * (unsigned)R2 + 512) >> 10);
860
10/10
✓ Branch 0 taken 12073484 times.
✓ Branch 1 taken 942352 times.
✓ Branch 2 taken 11689188 times.
✓ Branch 3 taken 384296 times.
✓ Branch 4 taken 5828619 times.
✓ Branch 5 taken 5860569 times.
✓ Branch 6 taken 437 times.
✓ Branch 7 taken 5828182 times.
✓ Branch 8 taken 1285 times.
✓ Branch 9 taken 5859284 times.
13015836 UPDATE_WEIGHT_CLIP(decorr->weightA, decorr->delta, R2, L);
861 13015836 L = L2;
862 13015836 decorr->samplesB[0] = L;
863 }
864 }
865
866
2/2
✓ Branch 0 taken 163142922 times.
✓ Branch 1 taken 4422426 times.
167565348 if (type == AV_SAMPLE_FMT_S16P) {
867
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 163142921 times.
163142922 if (FFABS((int64_t)L) + FFABS((int64_t)R) > (1<<19)) {
868 1 av_log(s->avctx, AV_LOG_ERROR, "sample %d %d too large\n", L, R);
869 1 return AVERROR_INVALIDDATA;
870 }
871 }
872
873 167565347 pos = (pos + 1) & 7;
874
2/2
✓ Branch 0 taken 161293901 times.
✓ Branch 1 taken 6271446 times.
167565347 if (s->joint)
875 161293901 L += (unsigned)(R -= (unsigned)(L >> 1));
876 167565347 crc = (crc * 3 + L) * 3 + R;
877
878
2/2
✓ Branch 0 taken 1371242 times.
✓ Branch 1 taken 166194105 times.
167565347 if (type == AV_SAMPLE_FMT_FLTP) {
879 1371242 *dstfl_l++ = wv_get_value_float(s, &crc_extra_bits, L);
880 1371242 *dstfl_r++ = wv_get_value_float(s, &crc_extra_bits, R);
881
2/2
✓ Branch 0 taken 3051184 times.
✓ Branch 1 taken 163142921 times.
166194105 } else if (type == AV_SAMPLE_FMT_S32P) {
882 3051184 *dst32_l++ = wv_get_value_integer(s, &crc_extra_bits, L);
883 3051184 *dst32_r++ = wv_get_value_integer(s, &crc_extra_bits, R);
884 } else {
885 163142921 *dst16_l++ = wv_get_value_integer(s, &crc_extra_bits, L);
886 163142921 *dst16_r++ = wv_get_value_integer(s, &crc_extra_bits, R);
887 }
888 167565347 count++;
889
3/4
✓ Branch 0 taken 167565347 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 167557757 times.
✓ Branch 3 taken 7590 times.
167565347 } while (!last && count < s->samples);
890
891
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7590 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7590 if (last && count < s->samples) {
892 int size = av_get_bytes_per_sample(type);
893 memset((uint8_t*)dst_l + count*size, 0, (s->samples-count)*size);
894 memset((uint8_t*)dst_r + count*size, 0, (s->samples-count)*size);
895 }
896
897
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7590 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7590 if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
898 wv_check_crc(s, crc, crc_extra_bits))
899 return AVERROR_INVALIDDATA;
900
901 7590 return 0;
902 }
903
904 689 static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb,
905 void *dst, const int type)
906 {
907 689 int i, j, count = 0;
908 int last, t;
909 int A, S, T;
910 689 int pos = 0;
911 689 uint32_t crc = 0xFFFFFFFF;
912 689 uint32_t crc_extra_bits = 0xFFFFFFFF;
913 689 int16_t *dst16 = dst;
914 689 int32_t *dst32 = dst;
915 689 float *dstfl = dst;
916
917 689 s->one = s->zero = s->zeroes = 0;
918 do {
919 15611361 T = wv_get_value(s, gb, 0, &last);
920 15611361 S = 0;
921
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15611361 times.
15611361 if (last)
922 break;
923
2/2
✓ Branch 0 taken 104876917 times.
✓ Branch 1 taken 15611361 times.
120488278 for (i = 0; i < s->terms; i++) {
924 104876917 Decorr *decorr = &s->decorr[i];
925
926 104876917 t = decorr->value;
927
2/2
✓ Branch 0 taken 44372416 times.
✓ Branch 1 taken 60504501 times.
104876917 if (t > 8) {
928
2/2
✓ Branch 0 taken 11939195 times.
✓ Branch 1 taken 32433221 times.
44372416 if (t & 1)
929 11939195 A = 2U * decorr->samplesA[0] - decorr->samplesA[1];
930 else
931 32433221 A = (int)(3U * decorr->samplesA[0] - decorr->samplesA[1]) >> 1;
932 44372416 decorr->samplesA[1] = decorr->samplesA[0];
933 44372416 j = 0;
934 } else {
935 60504501 A = decorr->samplesA[pos];
936 60504501 j = (pos + t) & 7;
937 }
938
2/2
✓ Branch 0 taken 29647840 times.
✓ Branch 1 taken 75229077 times.
104876917 if (type != AV_SAMPLE_FMT_S16P)
939 29647840 S = T + ((decorr->weightA * (int64_t)A + 512) >> 10);
940 else
941 75229077 S = T + (unsigned)((int)(decorr->weightA * (unsigned)A + 512) >> 10);
942
4/4
✓ Branch 0 taken 96585985 times.
✓ Branch 1 taken 8290932 times.
✓ Branch 2 taken 92156442 times.
✓ Branch 3 taken 4429543 times.
104876917 if (A && T)
943 92156442 decorr->weightA -= ((((T ^ A) >> 30) & 2) - 1) * decorr->delta;
944 104876917 decorr->samplesA[j] = T = S;
945 }
946 15611361 pos = (pos + 1) & 7;
947 15611361 crc = crc * 3 + S;
948
949
2/2
✓ Branch 0 taken 432000 times.
✓ Branch 1 taken 15179361 times.
15611361 if (type == AV_SAMPLE_FMT_FLTP) {
950 432000 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, S);
951
2/2
✓ Branch 0 taken 4691168 times.
✓ Branch 1 taken 10488193 times.
15179361 } else if (type == AV_SAMPLE_FMT_S32P) {
952 4691168 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, S);
953 } else {
954 10488193 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, S);
955 }
956 15611361 count++;
957
3/4
✓ Branch 0 taken 15611361 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15610672 times.
✓ Branch 3 taken 689 times.
15611361 } while (!last && count < s->samples);
958
959
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 689 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
689 if (last && count < s->samples) {
960 int size = av_get_bytes_per_sample(type);
961 memset((uint8_t*)dst + count*size, 0, (s->samples-count)*size);
962 }
963
964
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 689 times.
689 if (s->avctx->err_recognition & AV_EF_CRCCHECK) {
965 int ret = wv_check_crc(s, crc, crc_extra_bits);
966 if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE)
967 return ret;
968 }
969
970 689 return 0;
971 }
972
973 121 static av_cold int wv_alloc_frame_context(WavpackContext *c)
974 {
975 121 WavpackFrameContext **fdec = av_realloc_array(c->fdec, c->fdec_num + 1, sizeof(*c->fdec));
976
977
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 121 times.
121 if (!fdec)
978 return -1;
979 121 c->fdec = fdec;
980
981 121 c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
982
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 121 times.
121 if (!c->fdec[c->fdec_num])
983 return -1;
984 121 c->fdec_num++;
985 121 c->fdec[c->fdec_num - 1]->avctx = c->avctx;
986
987 121 return 0;
988 }
989
990 70 static int wv_dsd_reset(WavpackContext *s, int channels)
991 {
992 int i;
993
994 70 s->dsd_channels = 0;
995 70 ff_refstruct_unref(&s->dsdctx);
996 70 ff_refstruct_unref(&s->curr_progress);
997 70 ff_refstruct_unref(&s->prev_progress);
998
999
2/2
✓ Branch 0 taken 68 times.
✓ Branch 1 taken 2 times.
70 if (!channels)
1000 68 return 0;
1001
1002 if (WV_MAX_CHANNELS > SIZE_MAX / sizeof(*s->dsdctx) &&
1003 channels > SIZE_MAX / sizeof(*s->dsdctx))
1004 return AVERROR(EINVAL);
1005
1006 2 s->dsdctx = ff_refstruct_allocz(channels * sizeof(*s->dsdctx));
1007
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!s->dsdctx)
1008 return AVERROR(ENOMEM);
1009 2 s->dsd_channels = channels;
1010
1011
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
6 for (i = 0; i < channels; i++)
1012 4 memset(s->dsdctx[i].buf, 0x69, sizeof(s->dsdctx[i].buf));
1013
1014 2 ff_init_dsd_data();
1015
1016 2 return 0;
1017 }
1018
1019 #if HAVE_THREADS
1020 static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
1021 {
1022 WavpackContext *fsrc = src->priv_data;
1023 WavpackContext *fdst = dst->priv_data;
1024
1025 ff_refstruct_replace(&fdst->curr_progress, fsrc->curr_progress);
1026 ff_refstruct_replace(&fdst->dsdctx, fsrc->dsdctx);
1027 fdst->dsd_channels = fsrc->dsd_channels;
1028
1029 return 0;
1030 }
1031
1032 static av_cold int progress_pool_init_cb(FFRefStructOpaque opaque, void *obj)
1033 {
1034 ThreadProgress *progress = obj;
1035 return ff_thread_progress_init(progress, 1);
1036 }
1037
1038 static void progress_pool_reset_cb(FFRefStructOpaque opaque, void *obj)
1039 {
1040 ThreadProgress *progress = obj;
1041 ff_thread_progress_reset(progress);
1042 }
1043
1044 static av_cold void progress_pool_free_entry_cb(FFRefStructOpaque opaque, void *obj)
1045 {
1046 ThreadProgress *progress = obj;
1047 ff_thread_progress_destroy(progress);
1048 }
1049 #endif
1050
1051 68 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
1052 {
1053 68 WavpackContext *s = avctx->priv_data;
1054
1055 68 s->avctx = avctx;
1056
1057 68 s->fdec_num = 0;
1058
1059 #if HAVE_THREADS
1060
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 68 times.
68 if (ff_thread_sync_ref(avctx, offsetof(WavpackContext, progress_pool)) == FF_THREAD_IS_FIRST_THREAD) {
1061 s->progress_pool = ff_refstruct_pool_alloc_ext(sizeof(*s->curr_progress),
1062 FF_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR, NULL,
1063 progress_pool_init_cb,
1064 progress_pool_reset_cb,
1065 progress_pool_free_entry_cb, NULL);
1066 if (!s->progress_pool)
1067 return AVERROR(ENOMEM);
1068 }
1069 #endif
1070
1071 68 return 0;
1072 }
1073
1074 68 static av_cold int wavpack_decode_end(AVCodecContext *avctx)
1075 {
1076 68 WavpackContext *s = avctx->priv_data;
1077
1078
2/2
✓ Branch 0 taken 121 times.
✓ Branch 1 taken 68 times.
189 for (int i = 0; i < s->fdec_num; i++)
1079 121 av_freep(&s->fdec[i]);
1080 68 av_freep(&s->fdec);
1081 68 s->fdec_num = 0;
1082
1083 68 ff_refstruct_pool_uninit(&s->progress_pool);
1084 68 wv_dsd_reset(s, 0);
1085
1086 68 return 0;
1087 }
1088
1089 8361 static int wavpack_decode_block(AVCodecContext *avctx, AVFrame *frame, int block_no,
1090 const uint8_t *buf, int buf_size, int *new_progress)
1091 {
1092 8361 WavpackContext *wc = avctx->priv_data;
1093 WavpackFrameContext *s;
1094 GetByteContext gb;
1095 enum AVSampleFormat sample_fmt;
1096 8361 void *samples_l = NULL, *samples_r = NULL;
1097 int ret;
1098 8361 int got_terms = 0, got_weights = 0, got_samples = 0,
1099 8361 got_entropy = 0, got_pcm = 0, got_float = 0, got_hybrid = 0;
1100 8361 int got_dsd = 0;
1101 int i, j, id, size, ssize, weights, t;
1102 8361 int bpp, chan = 0, orig_bpp, sample_rate = 0, rate_x = 1, dsd_mode = 0;
1103 int multiblock;
1104 8361 uint64_t chmask = 0;
1105
1106
3/4
✓ Branch 0 taken 121 times.
✓ Branch 1 taken 8240 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 121 times.
8361 if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
1107 av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
1108 return AVERROR_INVALIDDATA;
1109 }
1110
1111 8361 s = wc->fdec[block_no];
1112
1113 8361 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
1114 8361 memset(s->ch, 0, sizeof(s->ch));
1115 8361 s->extra_bits = 0;
1116 8361 s->and = s->or = s->shift = 0;
1117 8361 s->got_extra_bits = 0;
1118
1119 8361 bytestream2_init(&gb, buf, buf_size);
1120
1121 8361 s->samples = bytestream2_get_le32(&gb);
1122
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8361 times.
8361 if (s->samples != wc->samples) {
1123 av_log(avctx, AV_LOG_ERROR, "Mismatching number of samples in "
1124 "a sequence: %d and %d\n", wc->samples, s->samples);
1125 return AVERROR_INVALIDDATA;
1126 }
1127 8361 s->frame_flags = bytestream2_get_le32(&gb);
1128
1129
2/2
✓ Branch 0 taken 148 times.
✓ Branch 1 taken 8213 times.
8361 if (s->frame_flags & (WV_FLOAT_DATA | WV_DSD_DATA))
1130 148 sample_fmt = AV_SAMPLE_FMT_FLTP;
1131
2/2
✓ Branch 0 taken 7887 times.
✓ Branch 1 taken 326 times.
8213 else if ((s->frame_flags & 0x03) <= 1)
1132 7887 sample_fmt = AV_SAMPLE_FMT_S16P;
1133 else
1134 326 sample_fmt = AV_SAMPLE_FMT_S32P;
1135
1136
3/4
✓ Branch 0 taken 732 times.
✓ Branch 1 taken 7629 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 732 times.
8361 if (wc->ch_offset && avctx->sample_fmt != sample_fmt)
1137 return AVERROR_INVALIDDATA;
1138
1139 8361 bpp = av_get_bytes_per_sample(sample_fmt);
1140 8361 orig_bpp = ((s->frame_flags & 0x03) + 1) << 3;
1141 8361 multiblock = (s->frame_flags & WV_SINGLE_BLOCK) != WV_SINGLE_BLOCK;
1142
1143 8361 s->stereo = !(s->frame_flags & WV_MONO);
1144
2/2
✓ Branch 0 taken 8319 times.
✓ Branch 1 taken 42 times.
8361 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
1145 8361 s->joint = s->frame_flags & WV_JOINT_STEREO;
1146 8361 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
1147 8361 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
1148 8361 s->post_shift = bpp * 8 - orig_bpp + ((s->frame_flags >> 13) & 0x1f);
1149
2/4
✓ Branch 0 taken 8361 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8361 times.
8361 if (s->post_shift < 0 || s->post_shift > 31) {
1150 return AVERROR_INVALIDDATA;
1151 }
1152 8361 s->hybrid_maxclip = ((1LL << (orig_bpp - 1)) - 1);
1153 8361 s->hybrid_minclip = ((-1UL << (orig_bpp - 1)));
1154 8361 s->CRC = bytestream2_get_le32(&gb);
1155
1156 // parse metadata blocks
1157
2/2
✓ Branch 1 taken 49791 times.
✓ Branch 2 taken 8361 times.
58152 while (bytestream2_get_bytes_left(&gb)) {
1158 49791 id = bytestream2_get_byte(&gb);
1159 49791 size = bytestream2_get_byte(&gb);
1160
2/2
✓ Branch 0 taken 8387 times.
✓ Branch 1 taken 41404 times.
49791 if (id & WP_IDF_LONG)
1161 8387 size |= (bytestream2_get_le16u(&gb)) << 8;
1162 49791 size <<= 1; // size is specified in words
1163 49791 ssize = size;
1164
2/2
✓ Branch 0 taken 8774 times.
✓ Branch 1 taken 41017 times.
49791 if (id & WP_IDF_ODD)
1165 8774 size--;
1166
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 49791 times.
49791 if (size < 0) {
1167 av_log(avctx, AV_LOG_ERROR,
1168 "Got incorrect block %02X with size %i\n", id, size);
1169 break;
1170 }
1171
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 49791 times.
49791 if (bytestream2_get_bytes_left(&gb) < ssize) {
1172 av_log(avctx, AV_LOG_ERROR,
1173 "Block size %i is out of bounds\n", size);
1174 break;
1175 }
1176
12/13
✓ Branch 0 taken 8280 times.
✓ Branch 1 taken 8280 times.
✓ Branch 2 taken 8280 times.
✓ Branch 3 taken 8280 times.
✓ Branch 4 taken 7459 times.
✓ Branch 5 taken 168 times.
✓ Branch 6 taken 67 times.
✓ Branch 7 taken 8280 times.
✓ Branch 8 taken 81 times.
✓ Branch 9 taken 26 times.
✓ Branch 10 taken 297 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 293 times.
49791 switch (id & WP_IDF_MASK) {
1177 8280 case WP_ID_DECTERMS:
1178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (size > MAX_TERMS) {
1179 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
1180 s->terms = 0;
1181 bytestream2_skip(&gb, ssize);
1182 continue;
1183 }
1184 8280 s->terms = size;
1185
2/2
✓ Branch 0 taken 44344 times.
✓ Branch 1 taken 8280 times.
52624 for (i = 0; i < s->terms; i++) {
1186 44344 uint8_t val = bytestream2_get_byte(&gb);
1187 44344 s->decorr[s->terms - i - 1].value = (val & 0x1F) - 5;
1188 44344 s->decorr[s->terms - i - 1].delta = val >> 5;
1189 }
1190 8280 got_terms = 1;
1191 8280 break;
1192 8280 case WP_ID_DECWEIGHTS:
1193
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (!got_terms) {
1194 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
1195 continue;
1196 }
1197 8280 weights = size >> s->stereo_in;
1198
2/4
✓ Branch 0 taken 8280 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8280 times.
8280 if (weights > MAX_TERMS || weights > s->terms) {
1199 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
1200 bytestream2_skip(&gb, ssize);
1201 continue;
1202 }
1203
2/2
✓ Branch 0 taken 14571 times.
✓ Branch 1 taken 8280 times.
22851 for (i = 0; i < weights; i++) {
1204 14571 t = (int8_t)bytestream2_get_byte(&gb);
1205 14571 s->decorr[s->terms - i - 1].weightA = t * (1 << 3);
1206
2/2
✓ Branch 0 taken 9857 times.
✓ Branch 1 taken 4714 times.
14571 if (s->decorr[s->terms - i - 1].weightA > 0)
1207 9857 s->decorr[s->terms - i - 1].weightA +=
1208 9857 (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
1209
2/2
✓ Branch 0 taken 9956 times.
✓ Branch 1 taken 4615 times.
14571 if (s->stereo_in) {
1210 9956 t = (int8_t)bytestream2_get_byte(&gb);
1211 9956 s->decorr[s->terms - i - 1].weightB = t * (1 << 3);
1212
2/2
✓ Branch 0 taken 6850 times.
✓ Branch 1 taken 3106 times.
9956 if (s->decorr[s->terms - i - 1].weightB > 0)
1213 6850 s->decorr[s->terms - i - 1].weightB +=
1214 6850 (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
1215 }
1216 }
1217 8280 got_weights = 1;
1218 8280 break;
1219 8280 case WP_ID_DECSAMPLES:
1220
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (!got_terms) {
1221 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
1222 continue;
1223 }
1224 8280 t = 0;
1225
4/4
✓ Branch 0 taken 16502 times.
✓ Branch 1 taken 52 times.
✓ Branch 2 taken 8274 times.
✓ Branch 3 taken 8228 times.
16554 for (i = s->terms - 1; (i >= 0) && (t < size); i--) {
1226 8274 Decorr *decorr = &s->decorr[i];
1227
1228
2/2
✓ Branch 0 taken 8057 times.
✓ Branch 1 taken 217 times.
8274 if (decorr->value > 8) {
1229 8057 decorr->samplesA[0] =
1230 8057 wp_exp2(bytestream2_get_le16(&gb));
1231 8057 decorr->samplesA[1] =
1232 8057 wp_exp2(bytestream2_get_le16(&gb));
1233
1234
2/2
✓ Branch 0 taken 7453 times.
✓ Branch 1 taken 604 times.
8057 if (s->stereo_in) {
1235 7453 decorr->samplesB[0] =
1236 7453 wp_exp2(bytestream2_get_le16(&gb));
1237 7453 decorr->samplesB[1] =
1238 7453 wp_exp2(bytestream2_get_le16(&gb));
1239 7453 t += 4;
1240 }
1241 8057 t += 4;
1242
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 217 times.
217 } else if (decorr->value < 0) {
1243 decorr->samplesA[0] =
1244 wp_exp2(bytestream2_get_le16(&gb));
1245 decorr->samplesB[0] =
1246 wp_exp2(bytestream2_get_le16(&gb));
1247 t += 4;
1248 } else {
1249
2/2
✓ Branch 0 taken 375 times.
✓ Branch 1 taken 217 times.
592 for (j = 0; j < decorr->value; j++) {
1250 375 decorr->samplesA[j] =
1251 375 wp_exp2(bytestream2_get_le16(&gb));
1252
2/2
✓ Branch 0 taken 221 times.
✓ Branch 1 taken 154 times.
375 if (s->stereo_in) {
1253 221 decorr->samplesB[j] =
1254 221 wp_exp2(bytestream2_get_le16(&gb));
1255 }
1256 }
1257 217 t += decorr->value * 2 * (s->stereo_in + 1);
1258 }
1259 }
1260 8280 got_samples = 1;
1261 8280 break;
1262 8280 case WP_ID_ENTROPY:
1263
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (size != 6 * (s->stereo_in + 1)) {
1264 av_log(avctx, AV_LOG_ERROR,
1265 "Entropy vars size should be %i, got %i.\n",
1266 6 * (s->stereo_in + 1), size);
1267 bytestream2_skip(&gb, ssize);
1268 continue;
1269 }
1270
2/2
✓ Branch 0 taken 15871 times.
✓ Branch 1 taken 8280 times.
24151 for (j = 0; j <= s->stereo_in; j++)
1271
2/2
✓ Branch 0 taken 47613 times.
✓ Branch 1 taken 15871 times.
63484 for (i = 0; i < 3; i++) {
1272 47613 s->ch[j].median[i] = wp_exp2(bytestream2_get_le16(&gb));
1273 }
1274 8280 got_entropy = 1;
1275 8280 break;
1276 7459 case WP_ID_HYBRID:
1277
1/2
✓ Branch 0 taken 7459 times.
✗ Branch 1 not taken.
7459 if (s->hybrid_bitrate) {
1278
2/2
✓ Branch 0 taken 14526 times.
✓ Branch 1 taken 7459 times.
21985 for (i = 0; i <= s->stereo_in; i++) {
1279 14526 s->ch[i].slow_level = wp_exp2(bytestream2_get_le16(&gb));
1280 14526 size -= 2;
1281 }
1282 }
1283
2/2
✓ Branch 0 taken 14526 times.
✓ Branch 1 taken 7459 times.
21985 for (i = 0; i < (s->stereo_in + 1); i++) {
1284 14526 s->ch[i].bitrate_acc = bytestream2_get_le16(&gb) << 16;
1285 14526 size -= 2;
1286 }
1287
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7459 times.
7459 if (size > 0) {
1288 for (i = 0; i < (s->stereo_in + 1); i++) {
1289 s->ch[i].bitrate_delta =
1290 wp_exp2((int16_t)bytestream2_get_le16(&gb));
1291 }
1292 } else {
1293
2/2
✓ Branch 0 taken 14526 times.
✓ Branch 1 taken 7459 times.
21985 for (i = 0; i < (s->stereo_in + 1); i++)
1294 14526 s->ch[i].bitrate_delta = 0;
1295 }
1296 7459 got_hybrid = 1;
1297 7459 break;
1298 168 case WP_ID_INT32INFO: {
1299 uint8_t val[4];
1300
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
168 if (size != 4) {
1301 av_log(avctx, AV_LOG_ERROR,
1302 "Invalid INT32INFO, size = %i\n",
1303 size);
1304 bytestream2_skip(&gb, ssize - 4);
1305 continue;
1306 }
1307 168 bytestream2_get_buffer(&gb, val, 4);
1308
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
168 if (val[0] > 30) {
1309 av_log(avctx, AV_LOG_ERROR,
1310 "Invalid INT32INFO, extra_bits = %d (> 30)\n", val[0]);
1311 continue;
1312 } else {
1313 168 s->extra_bits = val[0];
1314 }
1315
2/2
✓ Branch 0 taken 160 times.
✓ Branch 1 taken 8 times.
168 if (val[1])
1316 160 s->shift = val[1];
1317
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
168 if (val[2]) {
1318 s->and = s->or = 1;
1319 s->shift = val[2];
1320 }
1321
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
168 if (val[3]) {
1322 s->and = 1;
1323 s->shift = val[3];
1324 }
1325
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
168 if (s->shift > 31) {
1326 av_log(avctx, AV_LOG_ERROR,
1327 "Invalid INT32INFO, shift = %d (> 31)\n", s->shift);
1328 s->and = s->or = s->shift = 0;
1329 continue;
1330 }
1331 /* original WavPack decoder forces 32-bit lossy sound to be treated
1332 * as 24-bit one in order to have proper clipping */
1333
5/8
✓ Branch 0 taken 147 times.
✓ Branch 1 taken 21 times.
✓ Branch 2 taken 147 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 147 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 147 times.
168 if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) {
1334 s->post_shift += 8;
1335 s->shift -= 8;
1336 s->hybrid_maxclip >>= 8;
1337 s->hybrid_minclip >>= 8;
1338 }
1339 168 break;
1340 }
1341 67 case WP_ID_FLOATINFO:
1342
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if (size != 4) {
1343 av_log(avctx, AV_LOG_ERROR,
1344 "Invalid FLOATINFO, size = %i\n", size);
1345 bytestream2_skip(&gb, ssize);
1346 continue;
1347 }
1348 67 s->float_flag = bytestream2_get_byte(&gb);
1349 67 s->float_shift = bytestream2_get_byte(&gb);
1350 67 s->float_max_exp = bytestream2_get_byte(&gb);
1351
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if (s->float_shift > 31) {
1352 av_log(avctx, AV_LOG_ERROR,
1353 "Invalid FLOATINFO, shift = %d (> 31)\n", s->float_shift);
1354 s->float_shift = 0;
1355 continue;
1356 }
1357 67 got_float = 1;
1358 67 bytestream2_skip(&gb, 1);
1359 67 break;
1360 8280 case WP_ID_DATA:
1361
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8280 times.
8280 if ((ret = init_get_bits8(&s->gb, gb.buffer, size)) < 0)
1362 return ret;
1363 8280 bytestream2_skip(&gb, size);
1364 8280 got_pcm = 1;
1365 8280 break;
1366 81 case WP_ID_DSD_DATA:
1367
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
81 if (size < 2) {
1368 av_log(avctx, AV_LOG_ERROR, "Invalid DSD_DATA, size = %i\n",
1369 size);
1370 bytestream2_skip(&gb, ssize);
1371 continue;
1372 }
1373 81 rate_x = bytestream2_get_byte(&gb);
1374
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
81 if (rate_x > 30)
1375 return AVERROR_INVALIDDATA;
1376 81 rate_x = 1 << rate_x;
1377 81 dsd_mode = bytestream2_get_byte(&gb);
1378
5/6
✓ Branch 0 taken 67 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 52 times.
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 52 times.
81 if (dsd_mode && dsd_mode != 1 && dsd_mode != 3) {
1379 av_log(avctx, AV_LOG_ERROR, "Invalid DSD encoding mode: %d\n",
1380 dsd_mode);
1381 return AVERROR_INVALIDDATA;
1382 }
1383 81 bytestream2_init(&s->gbyte, gb.buffer, size-2);
1384 81 bytestream2_skip(&gb, size-2);
1385 81 got_dsd = 1;
1386 81 break;
1387 26 case WP_ID_EXTRABITS:
1388
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
26 if (size <= 4) {
1389 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n",
1390 size);
1391 bytestream2_skip(&gb, size);
1392 continue;
1393 }
1394
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 26 times.
26 if ((ret = init_get_bits8(&s->gb_extra_bits, gb.buffer, size)) < 0)
1395 return ret;
1396 26 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
1397 26 bytestream2_skip(&gb, size);
1398 26 s->got_extra_bits = 1;
1399 26 break;
1400 297 case WP_ID_CHANINFO:
1401
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 297 times.
297 if (size <= 1) {
1402 av_log(avctx, AV_LOG_ERROR,
1403 "Insufficient channel information\n");
1404 return AVERROR_INVALIDDATA;
1405 }
1406 297 chan = bytestream2_get_byte(&gb);
1407
2/7
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 274 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
297 switch (size - 2) {
1408 23 case 0:
1409 23 chmask = bytestream2_get_byte(&gb);
1410 23 break;
1411 274 case 1:
1412 274 chmask = bytestream2_get_le16(&gb);
1413 274 break;
1414 case 2:
1415 chmask = bytestream2_get_le24(&gb);
1416 break;
1417 case 3:
1418 chmask = bytestream2_get_le32(&gb);
1419 break;
1420 case 4:
1421 bytestream2_get_byte(&gb);
1422 chan |= (bytestream2_get_byte(&gb) & 0xF) << 8;
1423 chan += 1;
1424 chmask = bytestream2_get_le24(&gb);
1425 break;
1426 case 5:
1427 bytestream2_get_byte(&gb);
1428 chan |= (bytestream2_get_byte(&gb) & 0xF) << 8;
1429 chan += 1;
1430 chmask = bytestream2_get_le32(&gb);
1431 break;
1432 default:
1433 av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
1434 size);
1435 }
1436 av_assert1(chan <= WV_MAX_CHANNELS);
1437 297 break;
1438 case WP_ID_SAMPLE_RATE:
1439 if (size != 3) {
1440 av_log(avctx, AV_LOG_ERROR, "Invalid custom sample rate.\n");
1441 return AVERROR_INVALIDDATA;
1442 }
1443 sample_rate = bytestream2_get_le24(&gb);
1444 break;
1445 293 default:
1446 293 bytestream2_skip(&gb, size);
1447 }
1448
2/2
✓ Branch 0 taken 8774 times.
✓ Branch 1 taken 41017 times.
49791 if (id & WP_IDF_ODD)
1449 8774 bytestream2_skip(&gb, 1);
1450 }
1451
1452
2/2
✓ Branch 0 taken 8280 times.
✓ Branch 1 taken 81 times.
8361 if (got_pcm) {
1453
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (!got_terms) {
1454 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1455 return AVERROR_INVALIDDATA;
1456 }
1457
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (!got_weights) {
1458 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1459 return AVERROR_INVALIDDATA;
1460 }
1461
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (!got_samples) {
1462 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1463 return AVERROR_INVALIDDATA;
1464 }
1465
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8280 times.
8280 if (!got_entropy) {
1466 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1467 return AVERROR_INVALIDDATA;
1468 }
1469
3/4
✓ Branch 0 taken 7459 times.
✓ Branch 1 taken 821 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7459 times.
8280 if (s->hybrid && !got_hybrid) {
1470 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1471 return AVERROR_INVALIDDATA;
1472 }
1473
3/4
✓ Branch 0 taken 8213 times.
✓ Branch 1 taken 67 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8213 times.
8280 if (!got_float && sample_fmt == AV_SAMPLE_FMT_FLTP) {
1474 av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1475 return AVERROR_INVALIDDATA;
1476 }
1477
4/4
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 8254 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 18 times.
8280 if (s->got_extra_bits && sample_fmt != AV_SAMPLE_FMT_FLTP) {
1478 8 const int size = get_bits_left(&s->gb_extra_bits);
1479 8 const int wanted = s->samples * s->extra_bits << s->stereo_in;
1480
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (size < wanted) {
1481 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1482 s->got_extra_bits = 0;
1483 }
1484 }
1485 }
1486
1487
3/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 8280 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 81 times.
8361 if (!got_pcm && !got_dsd) {
1488 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1489 return AVERROR_INVALIDDATA;
1490 }
1491
1492
5/6
✓ Branch 0 taken 8280 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 8280 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 81 times.
✓ Branch 5 taken 8280 times.
8361 if ((got_pcm && wc->modulation != MODULATION_PCM) ||
1493
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
81 (got_dsd && wc->modulation != MODULATION_DSD)) {
1494 av_log(avctx, AV_LOG_ERROR, "Invalid PCM/DSD mix encountered\n");
1495 return AVERROR_INVALIDDATA;
1496 }
1497
1498
2/2
✓ Branch 0 taken 7629 times.
✓ Branch 1 taken 732 times.
8361 if (!wc->ch_offset) {
1499 7629 AVChannelLayout new_ch_layout = { 0 };
1500 int new_samplerate;
1501 7629 int sr = (s->frame_flags >> 23) & 0xf;
1502
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7629 times.
7629 if (sr == 0xf) {
1503 if (!sample_rate) {
1504 av_log(avctx, AV_LOG_ERROR, "Custom sample rate missing.\n");
1505 return AVERROR_INVALIDDATA;
1506 }
1507 new_samplerate = sample_rate;
1508 } else
1509 7629 new_samplerate = wv_rates[sr];
1510
1511
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7629 times.
7629 if (new_samplerate * (uint64_t)rate_x > INT_MAX)
1512 return AVERROR_INVALIDDATA;
1513 7629 new_samplerate *= rate_x;
1514
1515
2/2
✓ Branch 0 taken 297 times.
✓ Branch 1 taken 7332 times.
7629 if (multiblock) {
1516
1/2
✓ Branch 0 taken 297 times.
✗ Branch 1 not taken.
297 if (chmask) {
1517 297 av_channel_layout_from_mask(&new_ch_layout, chmask);
1518
2/4
✓ Branch 0 taken 297 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 297 times.
297 if (chan && new_ch_layout.nb_channels != chan) {
1519 av_log(avctx, AV_LOG_ERROR, "Channel mask does not match the channel count\n");
1520 return AVERROR_INVALIDDATA;
1521 }
1522 } else {
1523 av_channel_layout_default(&new_ch_layout, chan);
1524 }
1525 } else {
1526 7332 av_channel_layout_default(&new_ch_layout, s->stereo + 1);
1527 }
1528 av_assert1(new_ch_layout.nb_channels <= WV_MAX_CHANNELS);
1529
1530 /* clear DSD state if stream properties change */
1531
5/6
✓ Branch 0 taken 79 times.
✓ Branch 1 taken 7550 times.
✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 81 times.
✓ Branch 5 taken 7548 times.
7629 if ((wc->dsdctx && !got_dsd) ||
1532
3/4
✓ Branch 0 taken 79 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
160 got_dsd && (new_ch_layout.nb_channels != wc->dsd_channels ||
1533 79 av_channel_layout_compare(&new_ch_layout, &avctx->ch_layout) ||
1534
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 79 times.
79 new_samplerate != avctx->sample_rate)) {
1535
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 ret = wv_dsd_reset(wc, got_dsd ? new_ch_layout.nb_channels : 0);
1536
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (ret < 0) {
1537 av_log(avctx, AV_LOG_ERROR, "Error reinitializing the DSD context\n");
1538 return ret;
1539 }
1540 }
1541 7629 av_channel_layout_copy(&avctx->ch_layout, &new_ch_layout);
1542 7629 avctx->sample_rate = new_samplerate;
1543 7629 avctx->sample_fmt = sample_fmt;
1544 7629 avctx->bits_per_raw_sample = orig_bpp;
1545
1546 /* get output buffer */
1547 7629 frame->nb_samples = s->samples;
1548 7629 ret = ff_thread_get_buffer(avctx, frame, 0);
1549
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7629 times.
7629 if (ret < 0)
1550 return ret;
1551
1552 av_assert1(!!wc->progress_pool == !!(avctx->active_thread_type & FF_THREAD_FRAME));
1553
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7629 times.
7629 if (wc->progress_pool) {
1554 if (wc->dsdctx) {
1555 ff_refstruct_unref(&wc->prev_progress);
1556 wc->prev_progress = ff_refstruct_pool_get(wc->progress_pool);
1557 if (!wc->prev_progress)
1558 return AVERROR(ENOMEM);
1559 FFSWAP(ThreadProgress*, wc->prev_progress, wc->curr_progress);
1560 *new_progress = 1;
1561 }
1562 av_assert1(!!wc->dsdctx == !!wc->curr_progress);
1563 ff_thread_finish_setup(avctx);
1564 }
1565 }
1566
1567
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8361 times.
8361 if (wc->ch_offset + s->stereo >= avctx->ch_layout.nb_channels) {
1568 av_log(avctx, AV_LOG_WARNING, "Too many channels coded in a packet.\n");
1569 return ((avctx->err_recognition & AV_EF_EXPLODE) || !wc->ch_offset) ? AVERROR_INVALIDDATA : 0;
1570 }
1571
1572 8361 samples_l = frame->extended_data[wc->ch_offset];
1573
2/2
✓ Branch 0 taken 7714 times.
✓ Branch 1 taken 647 times.
8361 if (s->stereo)
1574 7714 samples_r = frame->extended_data[wc->ch_offset + 1];
1575
1576 8361 wc->ch_offset += 1 + s->stereo;
1577
1578
2/2
✓ Branch 0 taken 7672 times.
✓ Branch 1 taken 689 times.
8361 if (s->stereo_in) {
1579
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 7591 times.
7672 if (got_dsd) {
1580
2/2
✓ Branch 0 taken 52 times.
✓ Branch 1 taken 29 times.
81 if (dsd_mode == 3) {
1581 52 ret = wv_unpack_dsd_high(s, samples_l, samples_r);
1582
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 14 times.
29 } else if (dsd_mode == 1) {
1583 15 ret = wv_unpack_dsd_fast(s, samples_l, samples_r);
1584 } else {
1585 14 ret = wv_unpack_dsd_copy(s, samples_l, samples_r);
1586 }
1587 } else {
1588 7591 ret = wv_unpack_stereo(s, &s->gb, samples_l, samples_r, avctx->sample_fmt);
1589 }
1590
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7671 times.
7672 if (ret < 0)
1591 1 return ret;
1592 } else {
1593
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 689 times.
689 if (got_dsd) {
1594 if (dsd_mode == 3) {
1595 ret = wv_unpack_dsd_high(s, samples_l, NULL);
1596 } else if (dsd_mode == 1) {
1597 ret = wv_unpack_dsd_fast(s, samples_l, NULL);
1598 } else {
1599 ret = wv_unpack_dsd_copy(s, samples_l, NULL);
1600 }
1601 } else {
1602 689 ret = wv_unpack_mono(s, &s->gb, samples_l, avctx->sample_fmt);
1603 }
1604
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 689 times.
689 if (ret < 0)
1605 return ret;
1606
1607
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 647 times.
689 if (s->stereo)
1608 42 memcpy(samples_r, samples_l, bpp * s->samples);
1609 }
1610
1611 8360 return 0;
1612 }
1613
1614 static void wavpack_decode_flush(AVCodecContext *avctx)
1615 {
1616 WavpackContext *s = avctx->priv_data;
1617
1618 wv_dsd_reset(s, 0);
1619 }
1620
1621 162 static int dsd_channel(AVCodecContext *avctx, void *frmptr, int jobnr, int threadnr)
1622 {
1623 162 const WavpackContext *s = avctx->priv_data;
1624 162 AVFrame *frame = frmptr;
1625
1626 162 ff_dsd2pcm_translate(&s->dsdctx[jobnr], s->samples, 0,
1627 162 (uint8_t *)frame->extended_data[jobnr], 4,
1628 162 (float *)frame->extended_data[jobnr], 1);
1629
1630 162 return 0;
1631 }
1632
1633 7629 static int wavpack_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1634 int *got_frame_ptr, AVPacket *avpkt)
1635 {
1636 7629 WavpackContext *s = avctx->priv_data;
1637 7629 const uint8_t *buf = avpkt->data;
1638 7629 int buf_size = avpkt->size;
1639 int frame_size, ret, frame_flags;
1640 7629 int block = 0, new_progress = 0;
1641
1642 av_assert1(!s->curr_progress || s->dsdctx);
1643
1644
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7629 times.
7629 if (avpkt->size <= WV_HEADER_SIZE)
1645 return AVERROR_INVALIDDATA;
1646
1647 7629 s->ch_offset = 0;
1648
1649 /* determine number of samples */
1650 7629 s->samples = AV_RL32(buf + 20);
1651 7629 frame_flags = AV_RL32(buf + 24);
1652
2/4
✓ Branch 0 taken 7629 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7629 times.
7629 if (s->samples <= 0 || s->samples > WV_MAX_SAMPLES) {
1653 av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
1654 s->samples);
1655 return AVERROR_INVALIDDATA;
1656 }
1657
1658 7629 s->modulation = (frame_flags & WV_DSD_DATA) ? MODULATION_DSD : MODULATION_PCM;
1659
1660
2/2
✓ Branch 0 taken 8361 times.
✓ Branch 1 taken 7628 times.
15989 while (buf_size > WV_HEADER_SIZE) {
1661 8361 frame_size = AV_RL32(buf + 4) - 12;
1662 8361 buf += 20;
1663 8361 buf_size -= 20;
1664
2/4
✓ Branch 0 taken 8361 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8361 times.
8361 if (frame_size <= 0 || frame_size > buf_size) {
1665 av_log(avctx, AV_LOG_ERROR,
1666 "Block %d has invalid size (size %d vs. %d bytes left)\n",
1667 block, frame_size, buf_size);
1668 ret = AVERROR_INVALIDDATA;
1669 goto error;
1670 }
1671 8361 ret = wavpack_decode_block(avctx, frame, block, buf,
1672 frame_size, &new_progress);
1673
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8360 times.
8361 if (ret < 0)
1674 1 goto error;
1675 8360 block++;
1676 8360 buf += frame_size;
1677 8360 buf_size -= frame_size;
1678 }
1679
1680
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7628 times.
7628 if (s->ch_offset != avctx->ch_layout.nb_channels) {
1681 av_log(avctx, AV_LOG_ERROR, "Not enough channels coded in a packet.\n");
1682 ret = AVERROR_INVALIDDATA;
1683 goto error;
1684 }
1685
1686
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 7547 times.
7628 if (s->dsdctx) {
1687
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
81 if (s->prev_progress)
1688 ff_thread_progress_await(s->prev_progress, INT_MAX);
1689 81 avctx->execute2(avctx, dsd_channel, frame, NULL, avctx->ch_layout.nb_channels);
1690
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
81 if (s->curr_progress)
1691 ff_thread_progress_report(s->curr_progress, INT_MAX);
1692 }
1693
1694 7628 *got_frame_ptr = 1;
1695
1696 7628 return avpkt->size;
1697
1698 1 error:
1699
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (new_progress) {
1700 if (s->prev_progress)
1701 ff_thread_progress_await(s->prev_progress, INT_MAX);
1702 ff_thread_progress_report(s->curr_progress, INT_MAX);
1703 }
1704
1705 1 return ret;
1706 }
1707
1708 const FFCodec ff_wavpack_decoder = {
1709 .p.name = "wavpack",
1710 CODEC_LONG_NAME("WavPack"),
1711 .p.type = AVMEDIA_TYPE_AUDIO,
1712 .p.id = AV_CODEC_ID_WAVPACK,
1713 .priv_data_size = sizeof(WavpackContext),
1714 .init = wavpack_decode_init,
1715 .close = wavpack_decode_end,
1716 FF_CODEC_DECODE_CB(wavpack_decode_frame),
1717 .flush = wavpack_decode_flush,
1718 UPDATE_THREAD_CONTEXT(update_thread_context),
1719 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
1720 AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_CHANNEL_CONF,
1721 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1722 };
1723