| 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 "libavutil/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 | AVRefStructPool *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 | av_refstruct_unref(&s->dsdctx); | |
| 996 | 70 | av_refstruct_unref(&s->curr_progress); | |
| 997 | 70 | av_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 = av_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 | ✗ | av_refstruct_replace(&fdst->curr_progress, fsrc->curr_progress); | |
| 1026 | ✗ | av_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(AVRefStructOpaque 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(AVRefStructOpaque 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(AVRefStructOpaque 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 = av_refstruct_pool_alloc_ext(sizeof(*s->curr_progress), | |
| 1062 | AV_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 | av_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 | ✗ | av_refstruct_unref(&wc->prev_progress); | |
| 1556 | ✗ | wc->prev_progress = av_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 av_cold 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 |