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