1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Monkey's Audio lossless audio decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2007 Benjamin Zores <ben@geexbox.org> 4cabdff1aSopenharmony_ci * based upon libdemac from Dave Chapman. 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 <inttypes.h> 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 26cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 27cabdff1aSopenharmony_ci#include "libavutil/crc.h" 28cabdff1aSopenharmony_ci#include "libavutil/opt.h" 29cabdff1aSopenharmony_ci#include "lossless_audiodsp.h" 30cabdff1aSopenharmony_ci#include "avcodec.h" 31cabdff1aSopenharmony_ci#include "bswapdsp.h" 32cabdff1aSopenharmony_ci#include "bytestream.h" 33cabdff1aSopenharmony_ci#include "codec_internal.h" 34cabdff1aSopenharmony_ci#include "internal.h" 35cabdff1aSopenharmony_ci#include "get_bits.h" 36cabdff1aSopenharmony_ci#include "unary.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci/** 39cabdff1aSopenharmony_ci * @file 40cabdff1aSopenharmony_ci * Monkey's Audio lossless audio decoder 41cabdff1aSopenharmony_ci */ 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci#define MAX_CHANNELS 2 44cabdff1aSopenharmony_ci#define MAX_BYTESPERSAMPLE 3 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci#define APE_FRAMECODE_MONO_SILENCE 1 47cabdff1aSopenharmony_ci#define APE_FRAMECODE_STEREO_SILENCE 3 48cabdff1aSopenharmony_ci#define APE_FRAMECODE_PSEUDO_STEREO 4 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci#define HISTORY_SIZE 512 51cabdff1aSopenharmony_ci#define PREDICTOR_ORDER 8 52cabdff1aSopenharmony_ci/** Total size of all predictor histories */ 53cabdff1aSopenharmony_ci#define PREDICTOR_SIZE 50 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci#define YDELAYA (18 + PREDICTOR_ORDER*4) 56cabdff1aSopenharmony_ci#define YDELAYB (18 + PREDICTOR_ORDER*3) 57cabdff1aSopenharmony_ci#define XDELAYA (18 + PREDICTOR_ORDER*2) 58cabdff1aSopenharmony_ci#define XDELAYB (18 + PREDICTOR_ORDER) 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci#define YADAPTCOEFFSA 18 61cabdff1aSopenharmony_ci#define XADAPTCOEFFSA 14 62cabdff1aSopenharmony_ci#define YADAPTCOEFFSB 10 63cabdff1aSopenharmony_ci#define XADAPTCOEFFSB 5 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci/** 66cabdff1aSopenharmony_ci * Possible compression levels 67cabdff1aSopenharmony_ci * @{ 68cabdff1aSopenharmony_ci */ 69cabdff1aSopenharmony_cienum APECompressionLevel { 70cabdff1aSopenharmony_ci COMPRESSION_LEVEL_FAST = 1000, 71cabdff1aSopenharmony_ci COMPRESSION_LEVEL_NORMAL = 2000, 72cabdff1aSopenharmony_ci COMPRESSION_LEVEL_HIGH = 3000, 73cabdff1aSopenharmony_ci COMPRESSION_LEVEL_EXTRA_HIGH = 4000, 74cabdff1aSopenharmony_ci COMPRESSION_LEVEL_INSANE = 5000 75cabdff1aSopenharmony_ci}; 76cabdff1aSopenharmony_ci/** @} */ 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci#define APE_FILTER_LEVELS 3 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci/** Filter orders depending on compression level */ 81cabdff1aSopenharmony_cistatic const uint16_t ape_filter_orders[5][APE_FILTER_LEVELS] = { 82cabdff1aSopenharmony_ci { 0, 0, 0 }, 83cabdff1aSopenharmony_ci { 16, 0, 0 }, 84cabdff1aSopenharmony_ci { 64, 0, 0 }, 85cabdff1aSopenharmony_ci { 32, 256, 0 }, 86cabdff1aSopenharmony_ci { 16, 256, 1280 } 87cabdff1aSopenharmony_ci}; 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci/** Filter fraction bits depending on compression level */ 90cabdff1aSopenharmony_cistatic const uint8_t ape_filter_fracbits[5][APE_FILTER_LEVELS] = { 91cabdff1aSopenharmony_ci { 0, 0, 0 }, 92cabdff1aSopenharmony_ci { 11, 0, 0 }, 93cabdff1aSopenharmony_ci { 11, 0, 0 }, 94cabdff1aSopenharmony_ci { 10, 13, 0 }, 95cabdff1aSopenharmony_ci { 11, 13, 15 } 96cabdff1aSopenharmony_ci}; 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci/** Filters applied to the decoded data */ 100cabdff1aSopenharmony_citypedef struct APEFilter { 101cabdff1aSopenharmony_ci int16_t *coeffs; ///< actual coefficients used in filtering 102cabdff1aSopenharmony_ci int16_t *adaptcoeffs; ///< adaptive filter coefficients used for correcting of actual filter coefficients 103cabdff1aSopenharmony_ci int16_t *historybuffer; ///< filter memory 104cabdff1aSopenharmony_ci int16_t *delay; ///< filtered values 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci uint32_t avg; 107cabdff1aSopenharmony_ci} APEFilter; 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_citypedef struct APERice { 110cabdff1aSopenharmony_ci uint32_t k; 111cabdff1aSopenharmony_ci uint32_t ksum; 112cabdff1aSopenharmony_ci} APERice; 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_citypedef struct APERangecoder { 115cabdff1aSopenharmony_ci uint32_t low; ///< low end of interval 116cabdff1aSopenharmony_ci uint32_t range; ///< length of interval 117cabdff1aSopenharmony_ci uint32_t help; ///< bytes_to_follow resp. intermediate value 118cabdff1aSopenharmony_ci unsigned int buffer; ///< buffer for input/output 119cabdff1aSopenharmony_ci} APERangecoder; 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci/** Filter histories */ 122cabdff1aSopenharmony_citypedef struct APEPredictor { 123cabdff1aSopenharmony_ci int32_t *buf; 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci int32_t lastA[2]; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci int32_t filterA[2]; 128cabdff1aSopenharmony_ci int32_t filterB[2]; 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci uint32_t coeffsA[2][4]; ///< adaption coefficients 131cabdff1aSopenharmony_ci uint32_t coeffsB[2][5]; ///< adaption coefficients 132cabdff1aSopenharmony_ci int32_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE]; 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci unsigned int sample_pos; 135cabdff1aSopenharmony_ci} APEPredictor; 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_citypedef struct APEPredictor64 { 138cabdff1aSopenharmony_ci int64_t *buf; 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci int64_t lastA[2]; 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci int64_t filterA[2]; 143cabdff1aSopenharmony_ci int64_t filterB[2]; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci uint64_t coeffsA[2][4]; ///< adaption coefficients 146cabdff1aSopenharmony_ci uint64_t coeffsB[2][5]; ///< adaption coefficients 147cabdff1aSopenharmony_ci int64_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE]; 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci unsigned int sample_pos; 150cabdff1aSopenharmony_ci} APEPredictor64; 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci/** Decoder context */ 153cabdff1aSopenharmony_citypedef struct APEContext { 154cabdff1aSopenharmony_ci AVClass *class; ///< class for AVOptions 155cabdff1aSopenharmony_ci AVCodecContext *avctx; 156cabdff1aSopenharmony_ci BswapDSPContext bdsp; 157cabdff1aSopenharmony_ci LLAudDSPContext adsp; 158cabdff1aSopenharmony_ci int channels; 159cabdff1aSopenharmony_ci int samples; ///< samples left to decode in current frame 160cabdff1aSopenharmony_ci int bps; 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci int fileversion; ///< codec version, very important in decoding process 163cabdff1aSopenharmony_ci int compression_level; ///< compression levels 164cabdff1aSopenharmony_ci int fset; ///< which filter set to use (calculated from compression level) 165cabdff1aSopenharmony_ci int flags; ///< global decoder flags 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci uint32_t CRC; ///< signalled frame CRC 168cabdff1aSopenharmony_ci uint32_t CRC_state; ///< accumulated CRC 169cabdff1aSopenharmony_ci int frameflags; ///< frame flags 170cabdff1aSopenharmony_ci APEPredictor predictor; ///< predictor used for final reconstruction 171cabdff1aSopenharmony_ci APEPredictor64 predictor64; ///< 64bit predictor used for final reconstruction 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci int32_t *decoded_buffer; 174cabdff1aSopenharmony_ci int decoded_size; 175cabdff1aSopenharmony_ci int32_t *decoded[MAX_CHANNELS]; ///< decoded data for each channel 176cabdff1aSopenharmony_ci int blocks_per_loop; ///< maximum number of samples to decode for each call 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci int16_t* filterbuf[APE_FILTER_LEVELS]; ///< filter memory 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci APERangecoder rc; ///< rangecoder used to decode actual values 181cabdff1aSopenharmony_ci APERice riceX; ///< rice code parameters for the second channel 182cabdff1aSopenharmony_ci APERice riceY; ///< rice code parameters for the first channel 183cabdff1aSopenharmony_ci APEFilter filters[APE_FILTER_LEVELS][2]; ///< filters used for reconstruction 184cabdff1aSopenharmony_ci GetBitContext gb; 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci uint8_t *data; ///< current frame data 187cabdff1aSopenharmony_ci uint8_t *data_end; ///< frame data end 188cabdff1aSopenharmony_ci int data_size; ///< frame data allocated size 189cabdff1aSopenharmony_ci const uint8_t *ptr; ///< current position in frame data 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci int error; 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci void (*entropy_decode_mono)(struct APEContext *ctx, int blockstodecode); 194cabdff1aSopenharmony_ci void (*entropy_decode_stereo)(struct APEContext *ctx, int blockstodecode); 195cabdff1aSopenharmony_ci void (*predictor_decode_mono)(struct APEContext *ctx, int count); 196cabdff1aSopenharmony_ci void (*predictor_decode_stereo)(struct APEContext *ctx, int count); 197cabdff1aSopenharmony_ci} APEContext; 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_cistatic void ape_apply_filters(APEContext *ctx, int32_t *decoded0, 200cabdff1aSopenharmony_ci int32_t *decoded1, int count); 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_cistatic void entropy_decode_mono_0000(APEContext *ctx, int blockstodecode); 203cabdff1aSopenharmony_cistatic void entropy_decode_stereo_0000(APEContext *ctx, int blockstodecode); 204cabdff1aSopenharmony_cistatic void entropy_decode_mono_3860(APEContext *ctx, int blockstodecode); 205cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3860(APEContext *ctx, int blockstodecode); 206cabdff1aSopenharmony_cistatic void entropy_decode_mono_3900(APEContext *ctx, int blockstodecode); 207cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3900(APEContext *ctx, int blockstodecode); 208cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3930(APEContext *ctx, int blockstodecode); 209cabdff1aSopenharmony_cistatic void entropy_decode_mono_3990(APEContext *ctx, int blockstodecode); 210cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3990(APEContext *ctx, int blockstodecode); 211cabdff1aSopenharmony_ci 212cabdff1aSopenharmony_cistatic void predictor_decode_mono_3800(APEContext *ctx, int count); 213cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3800(APEContext *ctx, int count); 214cabdff1aSopenharmony_cistatic void predictor_decode_mono_3930(APEContext *ctx, int count); 215cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3930(APEContext *ctx, int count); 216cabdff1aSopenharmony_cistatic void predictor_decode_mono_3950(APEContext *ctx, int count); 217cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3950(APEContext *ctx, int count); 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_cistatic av_cold int ape_decode_close(AVCodecContext *avctx) 220cabdff1aSopenharmony_ci{ 221cabdff1aSopenharmony_ci APEContext *s = avctx->priv_data; 222cabdff1aSopenharmony_ci int i; 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci for (i = 0; i < APE_FILTER_LEVELS; i++) 225cabdff1aSopenharmony_ci av_freep(&s->filterbuf[i]); 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci av_freep(&s->decoded_buffer); 228cabdff1aSopenharmony_ci av_freep(&s->data); 229cabdff1aSopenharmony_ci s->decoded_size = s->data_size = 0; 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci return 0; 232cabdff1aSopenharmony_ci} 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_cistatic av_cold int ape_decode_init(AVCodecContext *avctx) 235cabdff1aSopenharmony_ci{ 236cabdff1aSopenharmony_ci APEContext *s = avctx->priv_data; 237cabdff1aSopenharmony_ci int channels = avctx->ch_layout.nb_channels; 238cabdff1aSopenharmony_ci int i; 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ci if (avctx->extradata_size != 6) { 241cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Incorrect extradata\n"); 242cabdff1aSopenharmony_ci return AVERROR(EINVAL); 243cabdff1aSopenharmony_ci } 244cabdff1aSopenharmony_ci if (channels > 2) { 245cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Only mono and stereo is supported\n"); 246cabdff1aSopenharmony_ci return AVERROR(EINVAL); 247cabdff1aSopenharmony_ci } 248cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = 249cabdff1aSopenharmony_ci s->bps = avctx->bits_per_coded_sample; 250cabdff1aSopenharmony_ci switch (s->bps) { 251cabdff1aSopenharmony_ci case 8: 252cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_U8P; 253cabdff1aSopenharmony_ci break; 254cabdff1aSopenharmony_ci case 16: 255cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S16P; 256cabdff1aSopenharmony_ci break; 257cabdff1aSopenharmony_ci case 24: 258cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S32P; 259cabdff1aSopenharmony_ci break; 260cabdff1aSopenharmony_ci default: 261cabdff1aSopenharmony_ci avpriv_request_sample(avctx, 262cabdff1aSopenharmony_ci "%d bits per coded sample", s->bps); 263cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 264cabdff1aSopenharmony_ci } 265cabdff1aSopenharmony_ci s->avctx = avctx; 266cabdff1aSopenharmony_ci s->channels = channels; 267cabdff1aSopenharmony_ci s->fileversion = AV_RL16(avctx->extradata); 268cabdff1aSopenharmony_ci s->compression_level = AV_RL16(avctx->extradata + 2); 269cabdff1aSopenharmony_ci s->flags = AV_RL16(avctx->extradata + 4); 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_VERBOSE, "Compression Level: %d - Flags: %d\n", 272cabdff1aSopenharmony_ci s->compression_level, s->flags); 273cabdff1aSopenharmony_ci if (s->compression_level % 1000 || s->compression_level > COMPRESSION_LEVEL_INSANE || 274cabdff1aSopenharmony_ci !s->compression_level || 275cabdff1aSopenharmony_ci (s->fileversion < 3930 && s->compression_level == COMPRESSION_LEVEL_INSANE)) { 276cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Incorrect compression level %d\n", 277cabdff1aSopenharmony_ci s->compression_level); 278cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 279cabdff1aSopenharmony_ci } 280cabdff1aSopenharmony_ci s->fset = s->compression_level / 1000 - 1; 281cabdff1aSopenharmony_ci for (i = 0; i < APE_FILTER_LEVELS; i++) { 282cabdff1aSopenharmony_ci if (!ape_filter_orders[s->fset][i]) 283cabdff1aSopenharmony_ci break; 284cabdff1aSopenharmony_ci if (!(s->filterbuf[i] = av_malloc((ape_filter_orders[s->fset][i] * 3 + HISTORY_SIZE) * 4))) 285cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 286cabdff1aSopenharmony_ci } 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci if (s->fileversion < 3860) { 289cabdff1aSopenharmony_ci s->entropy_decode_mono = entropy_decode_mono_0000; 290cabdff1aSopenharmony_ci s->entropy_decode_stereo = entropy_decode_stereo_0000; 291cabdff1aSopenharmony_ci } else if (s->fileversion < 3900) { 292cabdff1aSopenharmony_ci s->entropy_decode_mono = entropy_decode_mono_3860; 293cabdff1aSopenharmony_ci s->entropy_decode_stereo = entropy_decode_stereo_3860; 294cabdff1aSopenharmony_ci } else if (s->fileversion < 3930) { 295cabdff1aSopenharmony_ci s->entropy_decode_mono = entropy_decode_mono_3900; 296cabdff1aSopenharmony_ci s->entropy_decode_stereo = entropy_decode_stereo_3900; 297cabdff1aSopenharmony_ci } else if (s->fileversion < 3990) { 298cabdff1aSopenharmony_ci s->entropy_decode_mono = entropy_decode_mono_3900; 299cabdff1aSopenharmony_ci s->entropy_decode_stereo = entropy_decode_stereo_3930; 300cabdff1aSopenharmony_ci } else { 301cabdff1aSopenharmony_ci s->entropy_decode_mono = entropy_decode_mono_3990; 302cabdff1aSopenharmony_ci s->entropy_decode_stereo = entropy_decode_stereo_3990; 303cabdff1aSopenharmony_ci } 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_ci if (s->fileversion < 3930) { 306cabdff1aSopenharmony_ci s->predictor_decode_mono = predictor_decode_mono_3800; 307cabdff1aSopenharmony_ci s->predictor_decode_stereo = predictor_decode_stereo_3800; 308cabdff1aSopenharmony_ci } else if (s->fileversion < 3950) { 309cabdff1aSopenharmony_ci s->predictor_decode_mono = predictor_decode_mono_3930; 310cabdff1aSopenharmony_ci s->predictor_decode_stereo = predictor_decode_stereo_3930; 311cabdff1aSopenharmony_ci } else { 312cabdff1aSopenharmony_ci s->predictor_decode_mono = predictor_decode_mono_3950; 313cabdff1aSopenharmony_ci s->predictor_decode_stereo = predictor_decode_stereo_3950; 314cabdff1aSopenharmony_ci } 315cabdff1aSopenharmony_ci 316cabdff1aSopenharmony_ci ff_bswapdsp_init(&s->bdsp); 317cabdff1aSopenharmony_ci ff_llauddsp_init(&s->adsp); 318cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 319cabdff1aSopenharmony_ci avctx->ch_layout = (channels == 2) ? (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO 320cabdff1aSopenharmony_ci : (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci return 0; 323cabdff1aSopenharmony_ci} 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci/** 326cabdff1aSopenharmony_ci * @name APE range decoding functions 327cabdff1aSopenharmony_ci * @{ 328cabdff1aSopenharmony_ci */ 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_ci#define CODE_BITS 32 331cabdff1aSopenharmony_ci#define TOP_VALUE ((unsigned int)1 << (CODE_BITS-1)) 332cabdff1aSopenharmony_ci#define SHIFT_BITS (CODE_BITS - 9) 333cabdff1aSopenharmony_ci#define EXTRA_BITS ((CODE_BITS-2) % 8 + 1) 334cabdff1aSopenharmony_ci#define BOTTOM_VALUE (TOP_VALUE >> 8) 335cabdff1aSopenharmony_ci 336cabdff1aSopenharmony_ci/** Start the decoder */ 337cabdff1aSopenharmony_cistatic inline void range_start_decoding(APEContext *ctx) 338cabdff1aSopenharmony_ci{ 339cabdff1aSopenharmony_ci ctx->rc.buffer = bytestream_get_byte(&ctx->ptr); 340cabdff1aSopenharmony_ci ctx->rc.low = ctx->rc.buffer >> (8 - EXTRA_BITS); 341cabdff1aSopenharmony_ci ctx->rc.range = (uint32_t) 1 << EXTRA_BITS; 342cabdff1aSopenharmony_ci} 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci/** Perform normalization */ 345cabdff1aSopenharmony_cistatic inline void range_dec_normalize(APEContext *ctx) 346cabdff1aSopenharmony_ci{ 347cabdff1aSopenharmony_ci while (ctx->rc.range <= BOTTOM_VALUE) { 348cabdff1aSopenharmony_ci ctx->rc.buffer <<= 8; 349cabdff1aSopenharmony_ci if(ctx->ptr < ctx->data_end) { 350cabdff1aSopenharmony_ci ctx->rc.buffer += *ctx->ptr; 351cabdff1aSopenharmony_ci ctx->ptr++; 352cabdff1aSopenharmony_ci } else { 353cabdff1aSopenharmony_ci ctx->error = 1; 354cabdff1aSopenharmony_ci } 355cabdff1aSopenharmony_ci ctx->rc.low = (ctx->rc.low << 8) | ((ctx->rc.buffer >> 1) & 0xFF); 356cabdff1aSopenharmony_ci ctx->rc.range <<= 8; 357cabdff1aSopenharmony_ci } 358cabdff1aSopenharmony_ci} 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci/** 361cabdff1aSopenharmony_ci * Calculate cumulative frequency for next symbol. Does NO update! 362cabdff1aSopenharmony_ci * @param ctx decoder context 363cabdff1aSopenharmony_ci * @param tot_f is the total frequency or (code_value)1<<shift 364cabdff1aSopenharmony_ci * @return the cumulative frequency 365cabdff1aSopenharmony_ci */ 366cabdff1aSopenharmony_cistatic inline int range_decode_culfreq(APEContext *ctx, int tot_f) 367cabdff1aSopenharmony_ci{ 368cabdff1aSopenharmony_ci range_dec_normalize(ctx); 369cabdff1aSopenharmony_ci ctx->rc.help = ctx->rc.range / tot_f; 370cabdff1aSopenharmony_ci return ctx->rc.low / ctx->rc.help; 371cabdff1aSopenharmony_ci} 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci/** 374cabdff1aSopenharmony_ci * Decode value with given size in bits 375cabdff1aSopenharmony_ci * @param ctx decoder context 376cabdff1aSopenharmony_ci * @param shift number of bits to decode 377cabdff1aSopenharmony_ci */ 378cabdff1aSopenharmony_cistatic inline int range_decode_culshift(APEContext *ctx, int shift) 379cabdff1aSopenharmony_ci{ 380cabdff1aSopenharmony_ci range_dec_normalize(ctx); 381cabdff1aSopenharmony_ci ctx->rc.help = ctx->rc.range >> shift; 382cabdff1aSopenharmony_ci return ctx->rc.low / ctx->rc.help; 383cabdff1aSopenharmony_ci} 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_ci/** 387cabdff1aSopenharmony_ci * Update decoding state 388cabdff1aSopenharmony_ci * @param ctx decoder context 389cabdff1aSopenharmony_ci * @param sy_f the interval length (frequency of the symbol) 390cabdff1aSopenharmony_ci * @param lt_f the lower end (frequency sum of < symbols) 391cabdff1aSopenharmony_ci */ 392cabdff1aSopenharmony_cistatic inline void range_decode_update(APEContext *ctx, int sy_f, int lt_f) 393cabdff1aSopenharmony_ci{ 394cabdff1aSopenharmony_ci ctx->rc.low -= ctx->rc.help * lt_f; 395cabdff1aSopenharmony_ci ctx->rc.range = ctx->rc.help * sy_f; 396cabdff1aSopenharmony_ci} 397cabdff1aSopenharmony_ci 398cabdff1aSopenharmony_ci/** Decode n bits (n <= 16) without modelling */ 399cabdff1aSopenharmony_cistatic inline int range_decode_bits(APEContext *ctx, int n) 400cabdff1aSopenharmony_ci{ 401cabdff1aSopenharmony_ci int sym = range_decode_culshift(ctx, n); 402cabdff1aSopenharmony_ci range_decode_update(ctx, 1, sym); 403cabdff1aSopenharmony_ci return sym; 404cabdff1aSopenharmony_ci} 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_ci 407cabdff1aSopenharmony_ci#define MODEL_ELEMENTS 64 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_ci/** 410cabdff1aSopenharmony_ci * Fixed probabilities for symbols in Monkey Audio version 3.97 411cabdff1aSopenharmony_ci */ 412cabdff1aSopenharmony_cistatic const uint16_t counts_3970[22] = { 413cabdff1aSopenharmony_ci 0, 14824, 28224, 39348, 47855, 53994, 58171, 60926, 414cabdff1aSopenharmony_ci 62682, 63786, 64463, 64878, 65126, 65276, 65365, 65419, 415cabdff1aSopenharmony_ci 65450, 65469, 65480, 65487, 65491, 65493, 416cabdff1aSopenharmony_ci}; 417cabdff1aSopenharmony_ci 418cabdff1aSopenharmony_ci/** 419cabdff1aSopenharmony_ci * Probability ranges for symbols in Monkey Audio version 3.97 420cabdff1aSopenharmony_ci */ 421cabdff1aSopenharmony_cistatic const uint16_t counts_diff_3970[21] = { 422cabdff1aSopenharmony_ci 14824, 13400, 11124, 8507, 6139, 4177, 2755, 1756, 423cabdff1aSopenharmony_ci 1104, 677, 415, 248, 150, 89, 54, 31, 424cabdff1aSopenharmony_ci 19, 11, 7, 4, 2, 425cabdff1aSopenharmony_ci}; 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_ci/** 428cabdff1aSopenharmony_ci * Fixed probabilities for symbols in Monkey Audio version 3.98 429cabdff1aSopenharmony_ci */ 430cabdff1aSopenharmony_cistatic const uint16_t counts_3980[22] = { 431cabdff1aSopenharmony_ci 0, 19578, 36160, 48417, 56323, 60899, 63265, 64435, 432cabdff1aSopenharmony_ci 64971, 65232, 65351, 65416, 65447, 65466, 65476, 65482, 433cabdff1aSopenharmony_ci 65485, 65488, 65490, 65491, 65492, 65493, 434cabdff1aSopenharmony_ci}; 435cabdff1aSopenharmony_ci 436cabdff1aSopenharmony_ci/** 437cabdff1aSopenharmony_ci * Probability ranges for symbols in Monkey Audio version 3.98 438cabdff1aSopenharmony_ci */ 439cabdff1aSopenharmony_cistatic const uint16_t counts_diff_3980[21] = { 440cabdff1aSopenharmony_ci 19578, 16582, 12257, 7906, 4576, 2366, 1170, 536, 441cabdff1aSopenharmony_ci 261, 119, 65, 31, 19, 10, 6, 3, 442cabdff1aSopenharmony_ci 3, 2, 1, 1, 1, 443cabdff1aSopenharmony_ci}; 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci/** 446cabdff1aSopenharmony_ci * Decode symbol 447cabdff1aSopenharmony_ci * @param ctx decoder context 448cabdff1aSopenharmony_ci * @param counts probability range start position 449cabdff1aSopenharmony_ci * @param counts_diff probability range widths 450cabdff1aSopenharmony_ci */ 451cabdff1aSopenharmony_cistatic inline int range_get_symbol(APEContext *ctx, 452cabdff1aSopenharmony_ci const uint16_t counts[], 453cabdff1aSopenharmony_ci const uint16_t counts_diff[]) 454cabdff1aSopenharmony_ci{ 455cabdff1aSopenharmony_ci int symbol, cf; 456cabdff1aSopenharmony_ci 457cabdff1aSopenharmony_ci cf = range_decode_culshift(ctx, 16); 458cabdff1aSopenharmony_ci 459cabdff1aSopenharmony_ci if(cf > 65492){ 460cabdff1aSopenharmony_ci symbol= cf - 65535 + 63; 461cabdff1aSopenharmony_ci range_decode_update(ctx, 1, cf); 462cabdff1aSopenharmony_ci if(cf > 65535) 463cabdff1aSopenharmony_ci ctx->error=1; 464cabdff1aSopenharmony_ci return symbol; 465cabdff1aSopenharmony_ci } 466cabdff1aSopenharmony_ci /* figure out the symbol inefficiently; a binary search would be much better */ 467cabdff1aSopenharmony_ci for (symbol = 0; counts[symbol + 1] <= cf; symbol++); 468cabdff1aSopenharmony_ci 469cabdff1aSopenharmony_ci range_decode_update(ctx, counts_diff[symbol], counts[symbol]); 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci return symbol; 472cabdff1aSopenharmony_ci} 473cabdff1aSopenharmony_ci/** @} */ // group rangecoder 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_cistatic inline void update_rice(APERice *rice, unsigned int x) 476cabdff1aSopenharmony_ci{ 477cabdff1aSopenharmony_ci int lim = rice->k ? (1 << (rice->k + 4)) : 0; 478cabdff1aSopenharmony_ci rice->ksum += ((x + 1) / 2) - ((rice->ksum + 16) >> 5); 479cabdff1aSopenharmony_ci 480cabdff1aSopenharmony_ci if (rice->ksum < lim) 481cabdff1aSopenharmony_ci rice->k--; 482cabdff1aSopenharmony_ci else if (rice->ksum >= (1 << (rice->k + 5)) && rice->k < 24) 483cabdff1aSopenharmony_ci rice->k++; 484cabdff1aSopenharmony_ci} 485cabdff1aSopenharmony_ci 486cabdff1aSopenharmony_cistatic inline int get_rice_ook(GetBitContext *gb, int k) 487cabdff1aSopenharmony_ci{ 488cabdff1aSopenharmony_ci unsigned int x; 489cabdff1aSopenharmony_ci 490cabdff1aSopenharmony_ci x = get_unary(gb, 1, get_bits_left(gb)); 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci if (k) 493cabdff1aSopenharmony_ci x = (x << k) | get_bits(gb, k); 494cabdff1aSopenharmony_ci 495cabdff1aSopenharmony_ci return x; 496cabdff1aSopenharmony_ci} 497cabdff1aSopenharmony_ci 498cabdff1aSopenharmony_cistatic inline int ape_decode_value_3860(APEContext *ctx, GetBitContext *gb, 499cabdff1aSopenharmony_ci APERice *rice) 500cabdff1aSopenharmony_ci{ 501cabdff1aSopenharmony_ci unsigned int x, overflow; 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci overflow = get_unary(gb, 1, get_bits_left(gb)); 504cabdff1aSopenharmony_ci 505cabdff1aSopenharmony_ci if (ctx->fileversion > 3880) { 506cabdff1aSopenharmony_ci while (overflow >= 16) { 507cabdff1aSopenharmony_ci overflow -= 16; 508cabdff1aSopenharmony_ci rice->k += 4; 509cabdff1aSopenharmony_ci } 510cabdff1aSopenharmony_ci } 511cabdff1aSopenharmony_ci 512cabdff1aSopenharmony_ci if (!rice->k) 513cabdff1aSopenharmony_ci x = overflow; 514cabdff1aSopenharmony_ci else if(rice->k <= MIN_CACHE_BITS) { 515cabdff1aSopenharmony_ci x = (overflow << rice->k) + get_bits(gb, rice->k); 516cabdff1aSopenharmony_ci } else { 517cabdff1aSopenharmony_ci av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %"PRIu32"\n", rice->k); 518cabdff1aSopenharmony_ci ctx->error = 1; 519cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 520cabdff1aSopenharmony_ci } 521cabdff1aSopenharmony_ci rice->ksum += x - (rice->ksum + 8 >> 4); 522cabdff1aSopenharmony_ci if (rice->ksum < (rice->k ? 1 << (rice->k + 4) : 0)) 523cabdff1aSopenharmony_ci rice->k--; 524cabdff1aSopenharmony_ci else if (rice->ksum >= (1 << (rice->k + 5)) && rice->k < 24) 525cabdff1aSopenharmony_ci rice->k++; 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci /* Convert to signed */ 528cabdff1aSopenharmony_ci return ((x >> 1) ^ ((x & 1) - 1)) + 1; 529cabdff1aSopenharmony_ci} 530cabdff1aSopenharmony_ci 531cabdff1aSopenharmony_cistatic inline int ape_decode_value_3900(APEContext *ctx, APERice *rice) 532cabdff1aSopenharmony_ci{ 533cabdff1aSopenharmony_ci unsigned int x, overflow; 534cabdff1aSopenharmony_ci int tmpk; 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci overflow = range_get_symbol(ctx, counts_3970, counts_diff_3970); 537cabdff1aSopenharmony_ci 538cabdff1aSopenharmony_ci if (overflow == (MODEL_ELEMENTS - 1)) { 539cabdff1aSopenharmony_ci tmpk = range_decode_bits(ctx, 5); 540cabdff1aSopenharmony_ci overflow = 0; 541cabdff1aSopenharmony_ci } else 542cabdff1aSopenharmony_ci tmpk = (rice->k < 1) ? 0 : rice->k - 1; 543cabdff1aSopenharmony_ci 544cabdff1aSopenharmony_ci if (tmpk <= 16 || ctx->fileversion < 3910) { 545cabdff1aSopenharmony_ci if (tmpk > 23) { 546cabdff1aSopenharmony_ci av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %d\n", tmpk); 547cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 548cabdff1aSopenharmony_ci } 549cabdff1aSopenharmony_ci x = range_decode_bits(ctx, tmpk); 550cabdff1aSopenharmony_ci } else if (tmpk <= 31) { 551cabdff1aSopenharmony_ci x = range_decode_bits(ctx, 16); 552cabdff1aSopenharmony_ci x |= (range_decode_bits(ctx, tmpk - 16) << 16); 553cabdff1aSopenharmony_ci } else { 554cabdff1aSopenharmony_ci av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %d\n", tmpk); 555cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 556cabdff1aSopenharmony_ci } 557cabdff1aSopenharmony_ci x += overflow << tmpk; 558cabdff1aSopenharmony_ci 559cabdff1aSopenharmony_ci update_rice(rice, x); 560cabdff1aSopenharmony_ci 561cabdff1aSopenharmony_ci /* Convert to signed */ 562cabdff1aSopenharmony_ci return ((x >> 1) ^ ((x & 1) - 1)) + 1; 563cabdff1aSopenharmony_ci} 564cabdff1aSopenharmony_ci 565cabdff1aSopenharmony_cistatic inline int ape_decode_value_3990(APEContext *ctx, APERice *rice) 566cabdff1aSopenharmony_ci{ 567cabdff1aSopenharmony_ci unsigned int x, overflow, pivot; 568cabdff1aSopenharmony_ci int base; 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_ci pivot = FFMAX(rice->ksum >> 5, 1); 571cabdff1aSopenharmony_ci 572cabdff1aSopenharmony_ci overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980); 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci if (overflow == (MODEL_ELEMENTS - 1)) { 575cabdff1aSopenharmony_ci overflow = (unsigned)range_decode_bits(ctx, 16) << 16; 576cabdff1aSopenharmony_ci overflow |= range_decode_bits(ctx, 16); 577cabdff1aSopenharmony_ci } 578cabdff1aSopenharmony_ci 579cabdff1aSopenharmony_ci if (pivot < 0x10000) { 580cabdff1aSopenharmony_ci base = range_decode_culfreq(ctx, pivot); 581cabdff1aSopenharmony_ci range_decode_update(ctx, 1, base); 582cabdff1aSopenharmony_ci } else { 583cabdff1aSopenharmony_ci int base_hi = pivot, base_lo; 584cabdff1aSopenharmony_ci int bbits = 0; 585cabdff1aSopenharmony_ci 586cabdff1aSopenharmony_ci while (base_hi & ~0xFFFF) { 587cabdff1aSopenharmony_ci base_hi >>= 1; 588cabdff1aSopenharmony_ci bbits++; 589cabdff1aSopenharmony_ci } 590cabdff1aSopenharmony_ci base_hi = range_decode_culfreq(ctx, base_hi + 1); 591cabdff1aSopenharmony_ci range_decode_update(ctx, 1, base_hi); 592cabdff1aSopenharmony_ci base_lo = range_decode_culfreq(ctx, 1 << bbits); 593cabdff1aSopenharmony_ci range_decode_update(ctx, 1, base_lo); 594cabdff1aSopenharmony_ci 595cabdff1aSopenharmony_ci base = (base_hi << bbits) + base_lo; 596cabdff1aSopenharmony_ci } 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci x = base + overflow * pivot; 599cabdff1aSopenharmony_ci 600cabdff1aSopenharmony_ci update_rice(rice, x); 601cabdff1aSopenharmony_ci 602cabdff1aSopenharmony_ci /* Convert to signed */ 603cabdff1aSopenharmony_ci return ((x >> 1) ^ ((x & 1) - 1)) + 1; 604cabdff1aSopenharmony_ci} 605cabdff1aSopenharmony_ci 606cabdff1aSopenharmony_cistatic int get_k(int ksum) 607cabdff1aSopenharmony_ci{ 608cabdff1aSopenharmony_ci return av_log2(ksum) + !!ksum; 609cabdff1aSopenharmony_ci} 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_cistatic void decode_array_0000(APEContext *ctx, GetBitContext *gb, 612cabdff1aSopenharmony_ci int32_t *out, APERice *rice, int blockstodecode) 613cabdff1aSopenharmony_ci{ 614cabdff1aSopenharmony_ci int i; 615cabdff1aSopenharmony_ci unsigned ksummax, ksummin; 616cabdff1aSopenharmony_ci 617cabdff1aSopenharmony_ci rice->ksum = 0; 618cabdff1aSopenharmony_ci for (i = 0; i < FFMIN(blockstodecode, 5); i++) { 619cabdff1aSopenharmony_ci out[i] = get_rice_ook(&ctx->gb, 10); 620cabdff1aSopenharmony_ci rice->ksum += out[i]; 621cabdff1aSopenharmony_ci } 622cabdff1aSopenharmony_ci 623cabdff1aSopenharmony_ci if (blockstodecode <= 5) 624cabdff1aSopenharmony_ci goto end; 625cabdff1aSopenharmony_ci 626cabdff1aSopenharmony_ci rice->k = get_k(rice->ksum / 10); 627cabdff1aSopenharmony_ci if (rice->k >= 24) 628cabdff1aSopenharmony_ci return; 629cabdff1aSopenharmony_ci for (; i < FFMIN(blockstodecode, 64); i++) { 630cabdff1aSopenharmony_ci out[i] = get_rice_ook(&ctx->gb, rice->k); 631cabdff1aSopenharmony_ci rice->ksum += out[i]; 632cabdff1aSopenharmony_ci rice->k = get_k(rice->ksum / ((i + 1) * 2)); 633cabdff1aSopenharmony_ci if (rice->k >= 24) 634cabdff1aSopenharmony_ci return; 635cabdff1aSopenharmony_ci } 636cabdff1aSopenharmony_ci 637cabdff1aSopenharmony_ci if (blockstodecode <= 64) 638cabdff1aSopenharmony_ci goto end; 639cabdff1aSopenharmony_ci 640cabdff1aSopenharmony_ci rice->k = get_k(rice->ksum >> 7); 641cabdff1aSopenharmony_ci ksummax = 1 << rice->k + 7; 642cabdff1aSopenharmony_ci ksummin = rice->k ? (1 << rice->k + 6) : 0; 643cabdff1aSopenharmony_ci for (; i < blockstodecode; i++) { 644cabdff1aSopenharmony_ci if (get_bits_left(&ctx->gb) < 1) { 645cabdff1aSopenharmony_ci ctx->error = 1; 646cabdff1aSopenharmony_ci return; 647cabdff1aSopenharmony_ci } 648cabdff1aSopenharmony_ci out[i] = get_rice_ook(&ctx->gb, rice->k); 649cabdff1aSopenharmony_ci rice->ksum += out[i] - (unsigned)out[i - 64]; 650cabdff1aSopenharmony_ci while (rice->ksum < ksummin) { 651cabdff1aSopenharmony_ci rice->k--; 652cabdff1aSopenharmony_ci ksummin = rice->k ? ksummin >> 1 : 0; 653cabdff1aSopenharmony_ci ksummax >>= 1; 654cabdff1aSopenharmony_ci } 655cabdff1aSopenharmony_ci while (rice->ksum >= ksummax) { 656cabdff1aSopenharmony_ci rice->k++; 657cabdff1aSopenharmony_ci if (rice->k > 24) 658cabdff1aSopenharmony_ci return; 659cabdff1aSopenharmony_ci ksummax <<= 1; 660cabdff1aSopenharmony_ci ksummin = ksummin ? ksummin << 1 : 128; 661cabdff1aSopenharmony_ci } 662cabdff1aSopenharmony_ci } 663cabdff1aSopenharmony_ci 664cabdff1aSopenharmony_ciend: 665cabdff1aSopenharmony_ci for (i = 0; i < blockstodecode; i++) 666cabdff1aSopenharmony_ci out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1; 667cabdff1aSopenharmony_ci} 668cabdff1aSopenharmony_ci 669cabdff1aSopenharmony_cistatic void entropy_decode_mono_0000(APEContext *ctx, int blockstodecode) 670cabdff1aSopenharmony_ci{ 671cabdff1aSopenharmony_ci decode_array_0000(ctx, &ctx->gb, ctx->decoded[0], &ctx->riceY, 672cabdff1aSopenharmony_ci blockstodecode); 673cabdff1aSopenharmony_ci} 674cabdff1aSopenharmony_ci 675cabdff1aSopenharmony_cistatic void entropy_decode_stereo_0000(APEContext *ctx, int blockstodecode) 676cabdff1aSopenharmony_ci{ 677cabdff1aSopenharmony_ci decode_array_0000(ctx, &ctx->gb, ctx->decoded[0], &ctx->riceY, 678cabdff1aSopenharmony_ci blockstodecode); 679cabdff1aSopenharmony_ci decode_array_0000(ctx, &ctx->gb, ctx->decoded[1], &ctx->riceX, 680cabdff1aSopenharmony_ci blockstodecode); 681cabdff1aSopenharmony_ci} 682cabdff1aSopenharmony_ci 683cabdff1aSopenharmony_cistatic void entropy_decode_mono_3860(APEContext *ctx, int blockstodecode) 684cabdff1aSopenharmony_ci{ 685cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 686cabdff1aSopenharmony_ci 687cabdff1aSopenharmony_ci while (blockstodecode--) 688cabdff1aSopenharmony_ci *decoded0++ = ape_decode_value_3860(ctx, &ctx->gb, &ctx->riceY); 689cabdff1aSopenharmony_ci} 690cabdff1aSopenharmony_ci 691cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3860(APEContext *ctx, int blockstodecode) 692cabdff1aSopenharmony_ci{ 693cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 694cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 695cabdff1aSopenharmony_ci int blocks = blockstodecode; 696cabdff1aSopenharmony_ci 697cabdff1aSopenharmony_ci while (blockstodecode--) 698cabdff1aSopenharmony_ci *decoded0++ = ape_decode_value_3860(ctx, &ctx->gb, &ctx->riceY); 699cabdff1aSopenharmony_ci while (blocks--) 700cabdff1aSopenharmony_ci *decoded1++ = ape_decode_value_3860(ctx, &ctx->gb, &ctx->riceX); 701cabdff1aSopenharmony_ci} 702cabdff1aSopenharmony_ci 703cabdff1aSopenharmony_cistatic void entropy_decode_mono_3900(APEContext *ctx, int blockstodecode) 704cabdff1aSopenharmony_ci{ 705cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 706cabdff1aSopenharmony_ci 707cabdff1aSopenharmony_ci while (blockstodecode--) 708cabdff1aSopenharmony_ci *decoded0++ = ape_decode_value_3900(ctx, &ctx->riceY); 709cabdff1aSopenharmony_ci} 710cabdff1aSopenharmony_ci 711cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3900(APEContext *ctx, int blockstodecode) 712cabdff1aSopenharmony_ci{ 713cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 714cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 715cabdff1aSopenharmony_ci int blocks = blockstodecode; 716cabdff1aSopenharmony_ci 717cabdff1aSopenharmony_ci while (blockstodecode--) 718cabdff1aSopenharmony_ci *decoded0++ = ape_decode_value_3900(ctx, &ctx->riceY); 719cabdff1aSopenharmony_ci range_dec_normalize(ctx); 720cabdff1aSopenharmony_ci // because of some implementation peculiarities we need to backpedal here 721cabdff1aSopenharmony_ci ctx->ptr -= 1; 722cabdff1aSopenharmony_ci range_start_decoding(ctx); 723cabdff1aSopenharmony_ci while (blocks--) 724cabdff1aSopenharmony_ci *decoded1++ = ape_decode_value_3900(ctx, &ctx->riceX); 725cabdff1aSopenharmony_ci} 726cabdff1aSopenharmony_ci 727cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3930(APEContext *ctx, int blockstodecode) 728cabdff1aSopenharmony_ci{ 729cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 730cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 731cabdff1aSopenharmony_ci 732cabdff1aSopenharmony_ci while (blockstodecode--) { 733cabdff1aSopenharmony_ci *decoded0++ = ape_decode_value_3900(ctx, &ctx->riceY); 734cabdff1aSopenharmony_ci *decoded1++ = ape_decode_value_3900(ctx, &ctx->riceX); 735cabdff1aSopenharmony_ci } 736cabdff1aSopenharmony_ci} 737cabdff1aSopenharmony_ci 738cabdff1aSopenharmony_cistatic void entropy_decode_mono_3990(APEContext *ctx, int blockstodecode) 739cabdff1aSopenharmony_ci{ 740cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 741cabdff1aSopenharmony_ci 742cabdff1aSopenharmony_ci while (blockstodecode--) 743cabdff1aSopenharmony_ci *decoded0++ = ape_decode_value_3990(ctx, &ctx->riceY); 744cabdff1aSopenharmony_ci} 745cabdff1aSopenharmony_ci 746cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3990(APEContext *ctx, int blockstodecode) 747cabdff1aSopenharmony_ci{ 748cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 749cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 750cabdff1aSopenharmony_ci 751cabdff1aSopenharmony_ci while (blockstodecode--) { 752cabdff1aSopenharmony_ci *decoded0++ = ape_decode_value_3990(ctx, &ctx->riceY); 753cabdff1aSopenharmony_ci *decoded1++ = ape_decode_value_3990(ctx, &ctx->riceX); 754cabdff1aSopenharmony_ci } 755cabdff1aSopenharmony_ci} 756cabdff1aSopenharmony_ci 757cabdff1aSopenharmony_cistatic int init_entropy_decoder(APEContext *ctx) 758cabdff1aSopenharmony_ci{ 759cabdff1aSopenharmony_ci /* Read the CRC */ 760cabdff1aSopenharmony_ci if (ctx->fileversion >= 3900) { 761cabdff1aSopenharmony_ci if (ctx->data_end - ctx->ptr < 6) 762cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 763cabdff1aSopenharmony_ci ctx->CRC = bytestream_get_be32(&ctx->ptr); 764cabdff1aSopenharmony_ci } else { 765cabdff1aSopenharmony_ci ctx->CRC = get_bits_long(&ctx->gb, 32); 766cabdff1aSopenharmony_ci } 767cabdff1aSopenharmony_ci 768cabdff1aSopenharmony_ci /* Read the frame flags if they exist */ 769cabdff1aSopenharmony_ci ctx->frameflags = 0; 770cabdff1aSopenharmony_ci ctx->CRC_state = UINT32_MAX; 771cabdff1aSopenharmony_ci if ((ctx->fileversion > 3820) && (ctx->CRC & 0x80000000)) { 772cabdff1aSopenharmony_ci ctx->CRC &= ~0x80000000; 773cabdff1aSopenharmony_ci 774cabdff1aSopenharmony_ci if (ctx->data_end - ctx->ptr < 6) 775cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 776cabdff1aSopenharmony_ci ctx->frameflags = bytestream_get_be32(&ctx->ptr); 777cabdff1aSopenharmony_ci } 778cabdff1aSopenharmony_ci 779cabdff1aSopenharmony_ci /* Initialize the rice structs */ 780cabdff1aSopenharmony_ci ctx->riceX.k = 10; 781cabdff1aSopenharmony_ci ctx->riceX.ksum = (1 << ctx->riceX.k) * 16; 782cabdff1aSopenharmony_ci ctx->riceY.k = 10; 783cabdff1aSopenharmony_ci ctx->riceY.ksum = (1 << ctx->riceY.k) * 16; 784cabdff1aSopenharmony_ci 785cabdff1aSopenharmony_ci if (ctx->fileversion >= 3900) { 786cabdff1aSopenharmony_ci /* The first 8 bits of input are ignored. */ 787cabdff1aSopenharmony_ci ctx->ptr++; 788cabdff1aSopenharmony_ci 789cabdff1aSopenharmony_ci range_start_decoding(ctx); 790cabdff1aSopenharmony_ci } 791cabdff1aSopenharmony_ci 792cabdff1aSopenharmony_ci return 0; 793cabdff1aSopenharmony_ci} 794cabdff1aSopenharmony_ci 795cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_fast_3320[1] = { 796cabdff1aSopenharmony_ci 375, 797cabdff1aSopenharmony_ci}; 798cabdff1aSopenharmony_ci 799cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_a_3800[3] = { 800cabdff1aSopenharmony_ci 64, 115, 64, 801cabdff1aSopenharmony_ci}; 802cabdff1aSopenharmony_ci 803cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_b_3800[2] = { 804cabdff1aSopenharmony_ci 740, 0 805cabdff1aSopenharmony_ci}; 806cabdff1aSopenharmony_ci 807cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_3930[4] = { 808cabdff1aSopenharmony_ci 360, 317, -109, 98 809cabdff1aSopenharmony_ci}; 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_cistatic const int64_t initial_coeffs_3930_64bit[4] = { 812cabdff1aSopenharmony_ci 360, 317, -109, 98 813cabdff1aSopenharmony_ci}; 814cabdff1aSopenharmony_ci 815cabdff1aSopenharmony_cistatic void init_predictor_decoder(APEContext *ctx) 816cabdff1aSopenharmony_ci{ 817cabdff1aSopenharmony_ci APEPredictor *p = &ctx->predictor; 818cabdff1aSopenharmony_ci APEPredictor64 *p64 = &ctx->predictor64; 819cabdff1aSopenharmony_ci 820cabdff1aSopenharmony_ci /* Zero the history buffers */ 821cabdff1aSopenharmony_ci memset(p->historybuffer, 0, PREDICTOR_SIZE * sizeof(*p->historybuffer)); 822cabdff1aSopenharmony_ci memset(p64->historybuffer, 0, PREDICTOR_SIZE * sizeof(*p64->historybuffer)); 823cabdff1aSopenharmony_ci p->buf = p->historybuffer; 824cabdff1aSopenharmony_ci p64->buf = p64->historybuffer; 825cabdff1aSopenharmony_ci 826cabdff1aSopenharmony_ci /* Initialize and zero the coefficients */ 827cabdff1aSopenharmony_ci if (ctx->fileversion < 3930) { 828cabdff1aSopenharmony_ci if (ctx->compression_level == COMPRESSION_LEVEL_FAST) { 829cabdff1aSopenharmony_ci memcpy(p->coeffsA[0], initial_coeffs_fast_3320, 830cabdff1aSopenharmony_ci sizeof(initial_coeffs_fast_3320)); 831cabdff1aSopenharmony_ci memcpy(p->coeffsA[1], initial_coeffs_fast_3320, 832cabdff1aSopenharmony_ci sizeof(initial_coeffs_fast_3320)); 833cabdff1aSopenharmony_ci } else { 834cabdff1aSopenharmony_ci memcpy(p->coeffsA[0], initial_coeffs_a_3800, 835cabdff1aSopenharmony_ci sizeof(initial_coeffs_a_3800)); 836cabdff1aSopenharmony_ci memcpy(p->coeffsA[1], initial_coeffs_a_3800, 837cabdff1aSopenharmony_ci sizeof(initial_coeffs_a_3800)); 838cabdff1aSopenharmony_ci } 839cabdff1aSopenharmony_ci } else { 840cabdff1aSopenharmony_ci memcpy(p->coeffsA[0], initial_coeffs_3930, sizeof(initial_coeffs_3930)); 841cabdff1aSopenharmony_ci memcpy(p->coeffsA[1], initial_coeffs_3930, sizeof(initial_coeffs_3930)); 842cabdff1aSopenharmony_ci memcpy(p64->coeffsA[0], initial_coeffs_3930_64bit, sizeof(initial_coeffs_3930_64bit)); 843cabdff1aSopenharmony_ci memcpy(p64->coeffsA[1], initial_coeffs_3930_64bit, sizeof(initial_coeffs_3930_64bit)); 844cabdff1aSopenharmony_ci } 845cabdff1aSopenharmony_ci memset(p->coeffsB, 0, sizeof(p->coeffsB)); 846cabdff1aSopenharmony_ci memset(p64->coeffsB, 0, sizeof(p64->coeffsB)); 847cabdff1aSopenharmony_ci if (ctx->fileversion < 3930) { 848cabdff1aSopenharmony_ci memcpy(p->coeffsB[0], initial_coeffs_b_3800, 849cabdff1aSopenharmony_ci sizeof(initial_coeffs_b_3800)); 850cabdff1aSopenharmony_ci memcpy(p->coeffsB[1], initial_coeffs_b_3800, 851cabdff1aSopenharmony_ci sizeof(initial_coeffs_b_3800)); 852cabdff1aSopenharmony_ci } 853cabdff1aSopenharmony_ci 854cabdff1aSopenharmony_ci p->filterA[0] = p->filterA[1] = 0; 855cabdff1aSopenharmony_ci p->filterB[0] = p->filterB[1] = 0; 856cabdff1aSopenharmony_ci p->lastA[0] = p->lastA[1] = 0; 857cabdff1aSopenharmony_ci 858cabdff1aSopenharmony_ci p64->filterA[0] = p64->filterA[1] = 0; 859cabdff1aSopenharmony_ci p64->filterB[0] = p64->filterB[1] = 0; 860cabdff1aSopenharmony_ci p64->lastA[0] = p64->lastA[1] = 0; 861cabdff1aSopenharmony_ci 862cabdff1aSopenharmony_ci p->sample_pos = 0; 863cabdff1aSopenharmony_ci 864cabdff1aSopenharmony_ci p64->sample_pos = 0; 865cabdff1aSopenharmony_ci} 866cabdff1aSopenharmony_ci 867cabdff1aSopenharmony_ci/** Get inverse sign of integer (-1 for positive, 1 for negative and 0 for zero) */ 868cabdff1aSopenharmony_cistatic inline int APESIGN(int32_t x) { 869cabdff1aSopenharmony_ci return (x < 0) - (x > 0); 870cabdff1aSopenharmony_ci} 871cabdff1aSopenharmony_ci 872cabdff1aSopenharmony_cistatic av_always_inline int filter_fast_3320(APEPredictor *p, 873cabdff1aSopenharmony_ci const int decoded, const int filter, 874cabdff1aSopenharmony_ci const int delayA) 875cabdff1aSopenharmony_ci{ 876cabdff1aSopenharmony_ci int32_t predictionA; 877cabdff1aSopenharmony_ci 878cabdff1aSopenharmony_ci p->buf[delayA] = p->lastA[filter]; 879cabdff1aSopenharmony_ci if (p->sample_pos < 3) { 880cabdff1aSopenharmony_ci p->lastA[filter] = decoded; 881cabdff1aSopenharmony_ci p->filterA[filter] = decoded; 882cabdff1aSopenharmony_ci return decoded; 883cabdff1aSopenharmony_ci } 884cabdff1aSopenharmony_ci 885cabdff1aSopenharmony_ci predictionA = p->buf[delayA] * 2U - p->buf[delayA - 1]; 886cabdff1aSopenharmony_ci p->lastA[filter] = decoded + (unsigned)((int32_t)(predictionA * p->coeffsA[filter][0]) >> 9); 887cabdff1aSopenharmony_ci 888cabdff1aSopenharmony_ci if ((decoded ^ predictionA) > 0) 889cabdff1aSopenharmony_ci p->coeffsA[filter][0]++; 890cabdff1aSopenharmony_ci else 891cabdff1aSopenharmony_ci p->coeffsA[filter][0]--; 892cabdff1aSopenharmony_ci 893cabdff1aSopenharmony_ci p->filterA[filter] += (unsigned)p->lastA[filter]; 894cabdff1aSopenharmony_ci 895cabdff1aSopenharmony_ci return p->filterA[filter]; 896cabdff1aSopenharmony_ci} 897cabdff1aSopenharmony_ci 898cabdff1aSopenharmony_cistatic av_always_inline int filter_3800(APEPredictor *p, 899cabdff1aSopenharmony_ci const unsigned decoded, const int filter, 900cabdff1aSopenharmony_ci const int delayA, const int delayB, 901cabdff1aSopenharmony_ci const int start, const int shift) 902cabdff1aSopenharmony_ci{ 903cabdff1aSopenharmony_ci int32_t predictionA, predictionB, sign; 904cabdff1aSopenharmony_ci int32_t d0, d1, d2, d3, d4; 905cabdff1aSopenharmony_ci 906cabdff1aSopenharmony_ci p->buf[delayA] = p->lastA[filter]; 907cabdff1aSopenharmony_ci p->buf[delayB] = p->filterB[filter]; 908cabdff1aSopenharmony_ci if (p->sample_pos < start) { 909cabdff1aSopenharmony_ci predictionA = decoded + p->filterA[filter]; 910cabdff1aSopenharmony_ci p->lastA[filter] = decoded; 911cabdff1aSopenharmony_ci p->filterB[filter] = decoded; 912cabdff1aSopenharmony_ci p->filterA[filter] = predictionA; 913cabdff1aSopenharmony_ci return predictionA; 914cabdff1aSopenharmony_ci } 915cabdff1aSopenharmony_ci d2 = p->buf[delayA]; 916cabdff1aSopenharmony_ci d1 = (p->buf[delayA] - (unsigned)p->buf[delayA - 1]) * 2; 917cabdff1aSopenharmony_ci d0 = p->buf[delayA] + ((p->buf[delayA - 2] - (unsigned)p->buf[delayA - 1]) * 8); 918cabdff1aSopenharmony_ci d3 = p->buf[delayB] * 2U - p->buf[delayB - 1]; 919cabdff1aSopenharmony_ci d4 = p->buf[delayB]; 920cabdff1aSopenharmony_ci 921cabdff1aSopenharmony_ci predictionA = d0 * p->coeffsA[filter][0] + 922cabdff1aSopenharmony_ci d1 * p->coeffsA[filter][1] + 923cabdff1aSopenharmony_ci d2 * p->coeffsA[filter][2]; 924cabdff1aSopenharmony_ci 925cabdff1aSopenharmony_ci sign = APESIGN(decoded); 926cabdff1aSopenharmony_ci p->coeffsA[filter][0] += (((d0 >> 30) & 2) - 1) * sign; 927cabdff1aSopenharmony_ci p->coeffsA[filter][1] += (((d1 >> 28) & 8) - 4) * sign; 928cabdff1aSopenharmony_ci p->coeffsA[filter][2] += (((d2 >> 28) & 8) - 4) * sign; 929cabdff1aSopenharmony_ci 930cabdff1aSopenharmony_ci predictionB = d3 * p->coeffsB[filter][0] - 931cabdff1aSopenharmony_ci d4 * p->coeffsB[filter][1]; 932cabdff1aSopenharmony_ci p->lastA[filter] = decoded + (predictionA >> 11); 933cabdff1aSopenharmony_ci sign = APESIGN(p->lastA[filter]); 934cabdff1aSopenharmony_ci p->coeffsB[filter][0] += (((d3 >> 29) & 4) - 2) * sign; 935cabdff1aSopenharmony_ci p->coeffsB[filter][1] -= (((d4 >> 30) & 2) - 1) * sign; 936cabdff1aSopenharmony_ci 937cabdff1aSopenharmony_ci p->filterB[filter] = p->lastA[filter] + (unsigned)(predictionB >> shift); 938cabdff1aSopenharmony_ci p->filterA[filter] = p->filterB[filter] + (unsigned)((int)(p->filterA[filter] * 31U) >> 5); 939cabdff1aSopenharmony_ci 940cabdff1aSopenharmony_ci return p->filterA[filter]; 941cabdff1aSopenharmony_ci} 942cabdff1aSopenharmony_ci 943cabdff1aSopenharmony_cistatic void long_filter_high_3800(int32_t *buffer, int order, int shift, int length) 944cabdff1aSopenharmony_ci{ 945cabdff1aSopenharmony_ci int i, j; 946cabdff1aSopenharmony_ci int32_t dotprod, sign; 947cabdff1aSopenharmony_ci int32_t coeffs[256], delay[256]; 948cabdff1aSopenharmony_ci 949cabdff1aSopenharmony_ci if (order >= length) 950cabdff1aSopenharmony_ci return; 951cabdff1aSopenharmony_ci 952cabdff1aSopenharmony_ci memset(coeffs, 0, order * sizeof(*coeffs)); 953cabdff1aSopenharmony_ci for (i = 0; i < order; i++) 954cabdff1aSopenharmony_ci delay[i] = buffer[i]; 955cabdff1aSopenharmony_ci for (i = order; i < length; i++) { 956cabdff1aSopenharmony_ci dotprod = 0; 957cabdff1aSopenharmony_ci sign = APESIGN(buffer[i]); 958cabdff1aSopenharmony_ci for (j = 0; j < order; j++) { 959cabdff1aSopenharmony_ci dotprod += delay[j] * (unsigned)coeffs[j]; 960cabdff1aSopenharmony_ci coeffs[j] += ((delay[j] >> 31) | 1) * sign; 961cabdff1aSopenharmony_ci } 962cabdff1aSopenharmony_ci buffer[i] -= (unsigned)(dotprod >> shift); 963cabdff1aSopenharmony_ci for (j = 0; j < order - 1; j++) 964cabdff1aSopenharmony_ci delay[j] = delay[j + 1]; 965cabdff1aSopenharmony_ci delay[order - 1] = buffer[i]; 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci} 968cabdff1aSopenharmony_ci 969cabdff1aSopenharmony_cistatic void long_filter_ehigh_3830(int32_t *buffer, int length) 970cabdff1aSopenharmony_ci{ 971cabdff1aSopenharmony_ci int i, j; 972cabdff1aSopenharmony_ci int32_t dotprod, sign; 973cabdff1aSopenharmony_ci int32_t delay[8] = { 0 }; 974cabdff1aSopenharmony_ci uint32_t coeffs[8] = { 0 }; 975cabdff1aSopenharmony_ci 976cabdff1aSopenharmony_ci for (i = 0; i < length; i++) { 977cabdff1aSopenharmony_ci dotprod = 0; 978cabdff1aSopenharmony_ci sign = APESIGN(buffer[i]); 979cabdff1aSopenharmony_ci for (j = 7; j >= 0; j--) { 980cabdff1aSopenharmony_ci dotprod += delay[j] * coeffs[j]; 981cabdff1aSopenharmony_ci coeffs[j] += ((delay[j] >> 31) | 1) * sign; 982cabdff1aSopenharmony_ci } 983cabdff1aSopenharmony_ci for (j = 7; j > 0; j--) 984cabdff1aSopenharmony_ci delay[j] = delay[j - 1]; 985cabdff1aSopenharmony_ci delay[0] = buffer[i]; 986cabdff1aSopenharmony_ci buffer[i] -= (unsigned)(dotprod >> 9); 987cabdff1aSopenharmony_ci } 988cabdff1aSopenharmony_ci} 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3800(APEContext *ctx, int count) 991cabdff1aSopenharmony_ci{ 992cabdff1aSopenharmony_ci APEPredictor *p = &ctx->predictor; 993cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 994cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 995cabdff1aSopenharmony_ci int start = 4, shift = 10; 996cabdff1aSopenharmony_ci 997cabdff1aSopenharmony_ci if (ctx->compression_level == COMPRESSION_LEVEL_HIGH) { 998cabdff1aSopenharmony_ci start = 16; 999cabdff1aSopenharmony_ci long_filter_high_3800(decoded0, 16, 9, count); 1000cabdff1aSopenharmony_ci long_filter_high_3800(decoded1, 16, 9, count); 1001cabdff1aSopenharmony_ci } else if (ctx->compression_level == COMPRESSION_LEVEL_EXTRA_HIGH) { 1002cabdff1aSopenharmony_ci int order = 128, shift2 = 11; 1003cabdff1aSopenharmony_ci 1004cabdff1aSopenharmony_ci if (ctx->fileversion >= 3830) { 1005cabdff1aSopenharmony_ci order <<= 1; 1006cabdff1aSopenharmony_ci shift++; 1007cabdff1aSopenharmony_ci shift2++; 1008cabdff1aSopenharmony_ci long_filter_ehigh_3830(decoded0 + order, count - order); 1009cabdff1aSopenharmony_ci long_filter_ehigh_3830(decoded1 + order, count - order); 1010cabdff1aSopenharmony_ci } 1011cabdff1aSopenharmony_ci start = order; 1012cabdff1aSopenharmony_ci long_filter_high_3800(decoded0, order, shift2, count); 1013cabdff1aSopenharmony_ci long_filter_high_3800(decoded1, order, shift2, count); 1014cabdff1aSopenharmony_ci } 1015cabdff1aSopenharmony_ci 1016cabdff1aSopenharmony_ci while (count--) { 1017cabdff1aSopenharmony_ci int X = *decoded0, Y = *decoded1; 1018cabdff1aSopenharmony_ci if (ctx->compression_level == COMPRESSION_LEVEL_FAST) { 1019cabdff1aSopenharmony_ci *decoded0 = filter_fast_3320(p, Y, 0, YDELAYA); 1020cabdff1aSopenharmony_ci decoded0++; 1021cabdff1aSopenharmony_ci *decoded1 = filter_fast_3320(p, X, 1, XDELAYA); 1022cabdff1aSopenharmony_ci decoded1++; 1023cabdff1aSopenharmony_ci } else { 1024cabdff1aSopenharmony_ci *decoded0 = filter_3800(p, Y, 0, YDELAYA, YDELAYB, 1025cabdff1aSopenharmony_ci start, shift); 1026cabdff1aSopenharmony_ci decoded0++; 1027cabdff1aSopenharmony_ci *decoded1 = filter_3800(p, X, 1, XDELAYA, XDELAYB, 1028cabdff1aSopenharmony_ci start, shift); 1029cabdff1aSopenharmony_ci decoded1++; 1030cabdff1aSopenharmony_ci } 1031cabdff1aSopenharmony_ci 1032cabdff1aSopenharmony_ci /* Combined */ 1033cabdff1aSopenharmony_ci p->buf++; 1034cabdff1aSopenharmony_ci p->sample_pos++; 1035cabdff1aSopenharmony_ci 1036cabdff1aSopenharmony_ci /* Have we filled the history buffer? */ 1037cabdff1aSopenharmony_ci if (p->buf == p->historybuffer + HISTORY_SIZE) { 1038cabdff1aSopenharmony_ci memmove(p->historybuffer, p->buf, 1039cabdff1aSopenharmony_ci PREDICTOR_SIZE * sizeof(*p->historybuffer)); 1040cabdff1aSopenharmony_ci p->buf = p->historybuffer; 1041cabdff1aSopenharmony_ci } 1042cabdff1aSopenharmony_ci } 1043cabdff1aSopenharmony_ci} 1044cabdff1aSopenharmony_ci 1045cabdff1aSopenharmony_cistatic void predictor_decode_mono_3800(APEContext *ctx, int count) 1046cabdff1aSopenharmony_ci{ 1047cabdff1aSopenharmony_ci APEPredictor *p = &ctx->predictor; 1048cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 1049cabdff1aSopenharmony_ci int start = 4, shift = 10; 1050cabdff1aSopenharmony_ci 1051cabdff1aSopenharmony_ci if (ctx->compression_level == COMPRESSION_LEVEL_HIGH) { 1052cabdff1aSopenharmony_ci start = 16; 1053cabdff1aSopenharmony_ci long_filter_high_3800(decoded0, 16, 9, count); 1054cabdff1aSopenharmony_ci } else if (ctx->compression_level == COMPRESSION_LEVEL_EXTRA_HIGH) { 1055cabdff1aSopenharmony_ci int order = 128, shift2 = 11; 1056cabdff1aSopenharmony_ci 1057cabdff1aSopenharmony_ci if (ctx->fileversion >= 3830) { 1058cabdff1aSopenharmony_ci order <<= 1; 1059cabdff1aSopenharmony_ci shift++; 1060cabdff1aSopenharmony_ci shift2++; 1061cabdff1aSopenharmony_ci long_filter_ehigh_3830(decoded0 + order, count - order); 1062cabdff1aSopenharmony_ci } 1063cabdff1aSopenharmony_ci start = order; 1064cabdff1aSopenharmony_ci long_filter_high_3800(decoded0, order, shift2, count); 1065cabdff1aSopenharmony_ci } 1066cabdff1aSopenharmony_ci 1067cabdff1aSopenharmony_ci while (count--) { 1068cabdff1aSopenharmony_ci if (ctx->compression_level == COMPRESSION_LEVEL_FAST) { 1069cabdff1aSopenharmony_ci *decoded0 = filter_fast_3320(p, *decoded0, 0, YDELAYA); 1070cabdff1aSopenharmony_ci decoded0++; 1071cabdff1aSopenharmony_ci } else { 1072cabdff1aSopenharmony_ci *decoded0 = filter_3800(p, *decoded0, 0, YDELAYA, YDELAYB, 1073cabdff1aSopenharmony_ci start, shift); 1074cabdff1aSopenharmony_ci decoded0++; 1075cabdff1aSopenharmony_ci } 1076cabdff1aSopenharmony_ci 1077cabdff1aSopenharmony_ci /* Combined */ 1078cabdff1aSopenharmony_ci p->buf++; 1079cabdff1aSopenharmony_ci p->sample_pos++; 1080cabdff1aSopenharmony_ci 1081cabdff1aSopenharmony_ci /* Have we filled the history buffer? */ 1082cabdff1aSopenharmony_ci if (p->buf == p->historybuffer + HISTORY_SIZE) { 1083cabdff1aSopenharmony_ci memmove(p->historybuffer, p->buf, 1084cabdff1aSopenharmony_ci PREDICTOR_SIZE * sizeof(*p->historybuffer)); 1085cabdff1aSopenharmony_ci p->buf = p->historybuffer; 1086cabdff1aSopenharmony_ci } 1087cabdff1aSopenharmony_ci } 1088cabdff1aSopenharmony_ci} 1089cabdff1aSopenharmony_ci 1090cabdff1aSopenharmony_cistatic av_always_inline int predictor_update_3930(APEPredictor *p, 1091cabdff1aSopenharmony_ci const int decoded, const int filter, 1092cabdff1aSopenharmony_ci const int delayA) 1093cabdff1aSopenharmony_ci{ 1094cabdff1aSopenharmony_ci int32_t predictionA, sign; 1095cabdff1aSopenharmony_ci uint32_t d0, d1, d2, d3; 1096cabdff1aSopenharmony_ci 1097cabdff1aSopenharmony_ci p->buf[delayA] = p->lastA[filter]; 1098cabdff1aSopenharmony_ci d0 = p->buf[delayA ]; 1099cabdff1aSopenharmony_ci d1 = p->buf[delayA ] - (unsigned)p->buf[delayA - 1]; 1100cabdff1aSopenharmony_ci d2 = p->buf[delayA - 1] - (unsigned)p->buf[delayA - 2]; 1101cabdff1aSopenharmony_ci d3 = p->buf[delayA - 2] - (unsigned)p->buf[delayA - 3]; 1102cabdff1aSopenharmony_ci 1103cabdff1aSopenharmony_ci predictionA = d0 * p->coeffsA[filter][0] + 1104cabdff1aSopenharmony_ci d1 * p->coeffsA[filter][1] + 1105cabdff1aSopenharmony_ci d2 * p->coeffsA[filter][2] + 1106cabdff1aSopenharmony_ci d3 * p->coeffsA[filter][3]; 1107cabdff1aSopenharmony_ci 1108cabdff1aSopenharmony_ci p->lastA[filter] = decoded + (predictionA >> 9); 1109cabdff1aSopenharmony_ci p->filterA[filter] = p->lastA[filter] + ((int)(p->filterA[filter] * 31U) >> 5); 1110cabdff1aSopenharmony_ci 1111cabdff1aSopenharmony_ci sign = APESIGN(decoded); 1112cabdff1aSopenharmony_ci p->coeffsA[filter][0] += (((int32_t)d0 < 0) * 2 - 1) * sign; 1113cabdff1aSopenharmony_ci p->coeffsA[filter][1] += (((int32_t)d1 < 0) * 2 - 1) * sign; 1114cabdff1aSopenharmony_ci p->coeffsA[filter][2] += (((int32_t)d2 < 0) * 2 - 1) * sign; 1115cabdff1aSopenharmony_ci p->coeffsA[filter][3] += (((int32_t)d3 < 0) * 2 - 1) * sign; 1116cabdff1aSopenharmony_ci 1117cabdff1aSopenharmony_ci return p->filterA[filter]; 1118cabdff1aSopenharmony_ci} 1119cabdff1aSopenharmony_ci 1120cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3930(APEContext *ctx, int count) 1121cabdff1aSopenharmony_ci{ 1122cabdff1aSopenharmony_ci APEPredictor *p = &ctx->predictor; 1123cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 1124cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 1125cabdff1aSopenharmony_ci 1126cabdff1aSopenharmony_ci ape_apply_filters(ctx, ctx->decoded[0], ctx->decoded[1], count); 1127cabdff1aSopenharmony_ci 1128cabdff1aSopenharmony_ci while (count--) { 1129cabdff1aSopenharmony_ci /* Predictor Y */ 1130cabdff1aSopenharmony_ci int Y = *decoded1, X = *decoded0; 1131cabdff1aSopenharmony_ci *decoded0 = predictor_update_3930(p, Y, 0, YDELAYA); 1132cabdff1aSopenharmony_ci decoded0++; 1133cabdff1aSopenharmony_ci *decoded1 = predictor_update_3930(p, X, 1, XDELAYA); 1134cabdff1aSopenharmony_ci decoded1++; 1135cabdff1aSopenharmony_ci 1136cabdff1aSopenharmony_ci /* Combined */ 1137cabdff1aSopenharmony_ci p->buf++; 1138cabdff1aSopenharmony_ci 1139cabdff1aSopenharmony_ci /* Have we filled the history buffer? */ 1140cabdff1aSopenharmony_ci if (p->buf == p->historybuffer + HISTORY_SIZE) { 1141cabdff1aSopenharmony_ci memmove(p->historybuffer, p->buf, 1142cabdff1aSopenharmony_ci PREDICTOR_SIZE * sizeof(*p->historybuffer)); 1143cabdff1aSopenharmony_ci p->buf = p->historybuffer; 1144cabdff1aSopenharmony_ci } 1145cabdff1aSopenharmony_ci } 1146cabdff1aSopenharmony_ci} 1147cabdff1aSopenharmony_ci 1148cabdff1aSopenharmony_cistatic void predictor_decode_mono_3930(APEContext *ctx, int count) 1149cabdff1aSopenharmony_ci{ 1150cabdff1aSopenharmony_ci APEPredictor *p = &ctx->predictor; 1151cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 1152cabdff1aSopenharmony_ci 1153cabdff1aSopenharmony_ci ape_apply_filters(ctx, ctx->decoded[0], NULL, count); 1154cabdff1aSopenharmony_ci 1155cabdff1aSopenharmony_ci while (count--) { 1156cabdff1aSopenharmony_ci *decoded0 = predictor_update_3930(p, *decoded0, 0, YDELAYA); 1157cabdff1aSopenharmony_ci decoded0++; 1158cabdff1aSopenharmony_ci 1159cabdff1aSopenharmony_ci p->buf++; 1160cabdff1aSopenharmony_ci 1161cabdff1aSopenharmony_ci /* Have we filled the history buffer? */ 1162cabdff1aSopenharmony_ci if (p->buf == p->historybuffer + HISTORY_SIZE) { 1163cabdff1aSopenharmony_ci memmove(p->historybuffer, p->buf, 1164cabdff1aSopenharmony_ci PREDICTOR_SIZE * sizeof(*p->historybuffer)); 1165cabdff1aSopenharmony_ci p->buf = p->historybuffer; 1166cabdff1aSopenharmony_ci } 1167cabdff1aSopenharmony_ci } 1168cabdff1aSopenharmony_ci} 1169cabdff1aSopenharmony_ci 1170cabdff1aSopenharmony_cistatic av_always_inline int predictor_update_filter(APEPredictor64 *p, 1171cabdff1aSopenharmony_ci const int decoded, const int filter, 1172cabdff1aSopenharmony_ci const int delayA, const int delayB, 1173cabdff1aSopenharmony_ci const int adaptA, const int adaptB, 1174cabdff1aSopenharmony_ci int compression_level) 1175cabdff1aSopenharmony_ci{ 1176cabdff1aSopenharmony_ci int64_t predictionA, predictionB; 1177cabdff1aSopenharmony_ci int32_t sign; 1178cabdff1aSopenharmony_ci 1179cabdff1aSopenharmony_ci p->buf[delayA] = p->lastA[filter]; 1180cabdff1aSopenharmony_ci p->buf[adaptA] = APESIGN(p->buf[delayA]); 1181cabdff1aSopenharmony_ci p->buf[delayA - 1] = p->buf[delayA] - (uint64_t)p->buf[delayA - 1]; 1182cabdff1aSopenharmony_ci p->buf[adaptA - 1] = APESIGN(p->buf[delayA - 1]); 1183cabdff1aSopenharmony_ci 1184cabdff1aSopenharmony_ci predictionA = p->buf[delayA ] * p->coeffsA[filter][0] + 1185cabdff1aSopenharmony_ci p->buf[delayA - 1] * p->coeffsA[filter][1] + 1186cabdff1aSopenharmony_ci p->buf[delayA - 2] * p->coeffsA[filter][2] + 1187cabdff1aSopenharmony_ci p->buf[delayA - 3] * p->coeffsA[filter][3]; 1188cabdff1aSopenharmony_ci 1189cabdff1aSopenharmony_ci /* Apply a scaled first-order filter compression */ 1190cabdff1aSopenharmony_ci p->buf[delayB] = p->filterA[filter ^ 1] - ((int64_t)(p->filterB[filter] * 31ULL) >> 5); 1191cabdff1aSopenharmony_ci p->buf[adaptB] = APESIGN(p->buf[delayB]); 1192cabdff1aSopenharmony_ci p->buf[delayB - 1] = p->buf[delayB] - (uint64_t)p->buf[delayB - 1]; 1193cabdff1aSopenharmony_ci p->buf[adaptB - 1] = APESIGN(p->buf[delayB - 1]); 1194cabdff1aSopenharmony_ci p->filterB[filter] = p->filterA[filter ^ 1]; 1195cabdff1aSopenharmony_ci 1196cabdff1aSopenharmony_ci predictionB = p->buf[delayB ] * p->coeffsB[filter][0] + 1197cabdff1aSopenharmony_ci p->buf[delayB - 1] * p->coeffsB[filter][1] + 1198cabdff1aSopenharmony_ci p->buf[delayB - 2] * p->coeffsB[filter][2] + 1199cabdff1aSopenharmony_ci p->buf[delayB - 3] * p->coeffsB[filter][3] + 1200cabdff1aSopenharmony_ci p->buf[delayB - 4] * p->coeffsB[filter][4]; 1201cabdff1aSopenharmony_ci 1202cabdff1aSopenharmony_ci if (compression_level < COMPRESSION_LEVEL_INSANE) { 1203cabdff1aSopenharmony_ci predictionA = (int32_t)predictionA; 1204cabdff1aSopenharmony_ci predictionB = (int32_t)predictionB; 1205cabdff1aSopenharmony_ci p->lastA[filter] = (int32_t)(decoded + (unsigned)((int32_t)(predictionA + (predictionB >> 1)) >> 10)); 1206cabdff1aSopenharmony_ci } else { 1207cabdff1aSopenharmony_ci p->lastA[filter] = decoded + ((int64_t)((uint64_t)predictionA + (predictionB >> 1)) >> 10); 1208cabdff1aSopenharmony_ci } 1209cabdff1aSopenharmony_ci p->filterA[filter] = p->lastA[filter] + ((int64_t)(p->filterA[filter] * 31ULL) >> 5); 1210cabdff1aSopenharmony_ci 1211cabdff1aSopenharmony_ci sign = APESIGN(decoded); 1212cabdff1aSopenharmony_ci p->coeffsA[filter][0] += p->buf[adaptA ] * sign; 1213cabdff1aSopenharmony_ci p->coeffsA[filter][1] += p->buf[adaptA - 1] * sign; 1214cabdff1aSopenharmony_ci p->coeffsA[filter][2] += p->buf[adaptA - 2] * sign; 1215cabdff1aSopenharmony_ci p->coeffsA[filter][3] += p->buf[adaptA - 3] * sign; 1216cabdff1aSopenharmony_ci p->coeffsB[filter][0] += p->buf[adaptB ] * sign; 1217cabdff1aSopenharmony_ci p->coeffsB[filter][1] += p->buf[adaptB - 1] * sign; 1218cabdff1aSopenharmony_ci p->coeffsB[filter][2] += p->buf[adaptB - 2] * sign; 1219cabdff1aSopenharmony_ci p->coeffsB[filter][3] += p->buf[adaptB - 3] * sign; 1220cabdff1aSopenharmony_ci p->coeffsB[filter][4] += p->buf[adaptB - 4] * sign; 1221cabdff1aSopenharmony_ci 1222cabdff1aSopenharmony_ci return p->filterA[filter]; 1223cabdff1aSopenharmony_ci} 1224cabdff1aSopenharmony_ci 1225cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3950(APEContext *ctx, int count) 1226cabdff1aSopenharmony_ci{ 1227cabdff1aSopenharmony_ci APEPredictor64 *p = &ctx->predictor64; 1228cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 1229cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 1230cabdff1aSopenharmony_ci 1231cabdff1aSopenharmony_ci ape_apply_filters(ctx, ctx->decoded[0], ctx->decoded[1], count); 1232cabdff1aSopenharmony_ci 1233cabdff1aSopenharmony_ci while (count--) { 1234cabdff1aSopenharmony_ci /* Predictor Y */ 1235cabdff1aSopenharmony_ci *decoded0 = predictor_update_filter(p, *decoded0, 0, YDELAYA, YDELAYB, 1236cabdff1aSopenharmony_ci YADAPTCOEFFSA, YADAPTCOEFFSB, 1237cabdff1aSopenharmony_ci ctx->compression_level); 1238cabdff1aSopenharmony_ci decoded0++; 1239cabdff1aSopenharmony_ci *decoded1 = predictor_update_filter(p, *decoded1, 1, XDELAYA, XDELAYB, 1240cabdff1aSopenharmony_ci XADAPTCOEFFSA, XADAPTCOEFFSB, 1241cabdff1aSopenharmony_ci ctx->compression_level); 1242cabdff1aSopenharmony_ci decoded1++; 1243cabdff1aSopenharmony_ci 1244cabdff1aSopenharmony_ci /* Combined */ 1245cabdff1aSopenharmony_ci p->buf++; 1246cabdff1aSopenharmony_ci 1247cabdff1aSopenharmony_ci /* Have we filled the history buffer? */ 1248cabdff1aSopenharmony_ci if (p->buf == p->historybuffer + HISTORY_SIZE) { 1249cabdff1aSopenharmony_ci memmove(p->historybuffer, p->buf, 1250cabdff1aSopenharmony_ci PREDICTOR_SIZE * sizeof(*p->historybuffer)); 1251cabdff1aSopenharmony_ci p->buf = p->historybuffer; 1252cabdff1aSopenharmony_ci } 1253cabdff1aSopenharmony_ci } 1254cabdff1aSopenharmony_ci} 1255cabdff1aSopenharmony_ci 1256cabdff1aSopenharmony_cistatic void predictor_decode_mono_3950(APEContext *ctx, int count) 1257cabdff1aSopenharmony_ci{ 1258cabdff1aSopenharmony_ci APEPredictor64 *p = &ctx->predictor64; 1259cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 1260cabdff1aSopenharmony_ci int32_t predictionA, currentA, A, sign; 1261cabdff1aSopenharmony_ci 1262cabdff1aSopenharmony_ci ape_apply_filters(ctx, ctx->decoded[0], NULL, count); 1263cabdff1aSopenharmony_ci 1264cabdff1aSopenharmony_ci currentA = p->lastA[0]; 1265cabdff1aSopenharmony_ci 1266cabdff1aSopenharmony_ci while (count--) { 1267cabdff1aSopenharmony_ci A = *decoded0; 1268cabdff1aSopenharmony_ci 1269cabdff1aSopenharmony_ci p->buf[YDELAYA] = currentA; 1270cabdff1aSopenharmony_ci p->buf[YDELAYA - 1] = p->buf[YDELAYA] - (uint64_t)p->buf[YDELAYA - 1]; 1271cabdff1aSopenharmony_ci 1272cabdff1aSopenharmony_ci predictionA = p->buf[YDELAYA ] * p->coeffsA[0][0] + 1273cabdff1aSopenharmony_ci p->buf[YDELAYA - 1] * p->coeffsA[0][1] + 1274cabdff1aSopenharmony_ci p->buf[YDELAYA - 2] * p->coeffsA[0][2] + 1275cabdff1aSopenharmony_ci p->buf[YDELAYA - 3] * p->coeffsA[0][3]; 1276cabdff1aSopenharmony_ci 1277cabdff1aSopenharmony_ci currentA = A + (uint64_t)(predictionA >> 10); 1278cabdff1aSopenharmony_ci 1279cabdff1aSopenharmony_ci p->buf[YADAPTCOEFFSA] = APESIGN(p->buf[YDELAYA ]); 1280cabdff1aSopenharmony_ci p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]); 1281cabdff1aSopenharmony_ci 1282cabdff1aSopenharmony_ci sign = APESIGN(A); 1283cabdff1aSopenharmony_ci p->coeffsA[0][0] += p->buf[YADAPTCOEFFSA ] * sign; 1284cabdff1aSopenharmony_ci p->coeffsA[0][1] += p->buf[YADAPTCOEFFSA - 1] * sign; 1285cabdff1aSopenharmony_ci p->coeffsA[0][2] += p->buf[YADAPTCOEFFSA - 2] * sign; 1286cabdff1aSopenharmony_ci p->coeffsA[0][3] += p->buf[YADAPTCOEFFSA - 3] * sign; 1287cabdff1aSopenharmony_ci 1288cabdff1aSopenharmony_ci p->buf++; 1289cabdff1aSopenharmony_ci 1290cabdff1aSopenharmony_ci /* Have we filled the history buffer? */ 1291cabdff1aSopenharmony_ci if (p->buf == p->historybuffer + HISTORY_SIZE) { 1292cabdff1aSopenharmony_ci memmove(p->historybuffer, p->buf, 1293cabdff1aSopenharmony_ci PREDICTOR_SIZE * sizeof(*p->historybuffer)); 1294cabdff1aSopenharmony_ci p->buf = p->historybuffer; 1295cabdff1aSopenharmony_ci } 1296cabdff1aSopenharmony_ci 1297cabdff1aSopenharmony_ci p->filterA[0] = currentA + (uint64_t)((int64_t)(p->filterA[0] * 31U) >> 5); 1298cabdff1aSopenharmony_ci *(decoded0++) = p->filterA[0]; 1299cabdff1aSopenharmony_ci } 1300cabdff1aSopenharmony_ci 1301cabdff1aSopenharmony_ci p->lastA[0] = currentA; 1302cabdff1aSopenharmony_ci} 1303cabdff1aSopenharmony_ci 1304cabdff1aSopenharmony_cistatic void do_init_filter(APEFilter *f, int16_t *buf, int order) 1305cabdff1aSopenharmony_ci{ 1306cabdff1aSopenharmony_ci f->coeffs = buf; 1307cabdff1aSopenharmony_ci f->historybuffer = buf + order; 1308cabdff1aSopenharmony_ci f->delay = f->historybuffer + order * 2; 1309cabdff1aSopenharmony_ci f->adaptcoeffs = f->historybuffer + order; 1310cabdff1aSopenharmony_ci 1311cabdff1aSopenharmony_ci memset(f->historybuffer, 0, (order * 2) * sizeof(*f->historybuffer)); 1312cabdff1aSopenharmony_ci memset(f->coeffs, 0, order * sizeof(*f->coeffs)); 1313cabdff1aSopenharmony_ci f->avg = 0; 1314cabdff1aSopenharmony_ci} 1315cabdff1aSopenharmony_ci 1316cabdff1aSopenharmony_cistatic void init_filter(APEContext *ctx, APEFilter *f, int16_t *buf, int order) 1317cabdff1aSopenharmony_ci{ 1318cabdff1aSopenharmony_ci do_init_filter(&f[0], buf, order); 1319cabdff1aSopenharmony_ci do_init_filter(&f[1], buf + order * 3 + HISTORY_SIZE, order); 1320cabdff1aSopenharmony_ci} 1321cabdff1aSopenharmony_ci 1322cabdff1aSopenharmony_cistatic void do_apply_filter(APEContext *ctx, int version, APEFilter *f, 1323cabdff1aSopenharmony_ci int32_t *data, int count, int order, int fracbits) 1324cabdff1aSopenharmony_ci{ 1325cabdff1aSopenharmony_ci int res; 1326cabdff1aSopenharmony_ci unsigned absres; 1327cabdff1aSopenharmony_ci 1328cabdff1aSopenharmony_ci while (count--) { 1329cabdff1aSopenharmony_ci /* round fixedpoint scalar product */ 1330cabdff1aSopenharmony_ci res = ctx->adsp.scalarproduct_and_madd_int16(f->coeffs, 1331cabdff1aSopenharmony_ci f->delay - order, 1332cabdff1aSopenharmony_ci f->adaptcoeffs - order, 1333cabdff1aSopenharmony_ci order, APESIGN(*data)); 1334cabdff1aSopenharmony_ci res = (int64_t)(res + (1LL << (fracbits - 1))) >> fracbits; 1335cabdff1aSopenharmony_ci res += (unsigned)*data; 1336cabdff1aSopenharmony_ci *data++ = res; 1337cabdff1aSopenharmony_ci 1338cabdff1aSopenharmony_ci /* Update the output history */ 1339cabdff1aSopenharmony_ci *f->delay++ = av_clip_int16(res); 1340cabdff1aSopenharmony_ci 1341cabdff1aSopenharmony_ci if (version < 3980) { 1342cabdff1aSopenharmony_ci /* Version ??? to < 3.98 files (untested) */ 1343cabdff1aSopenharmony_ci f->adaptcoeffs[0] = (res == 0) ? 0 : ((res >> 28) & 8) - 4; 1344cabdff1aSopenharmony_ci f->adaptcoeffs[-4] >>= 1; 1345cabdff1aSopenharmony_ci f->adaptcoeffs[-8] >>= 1; 1346cabdff1aSopenharmony_ci } else { 1347cabdff1aSopenharmony_ci /* Version 3.98 and later files */ 1348cabdff1aSopenharmony_ci 1349cabdff1aSopenharmony_ci /* Update the adaption coefficients */ 1350cabdff1aSopenharmony_ci absres = FFABSU(res); 1351cabdff1aSopenharmony_ci if (absres) 1352cabdff1aSopenharmony_ci *f->adaptcoeffs = APESIGN(res) * 1353cabdff1aSopenharmony_ci (8 << ((absres > f->avg * 3LL) + (absres > (f->avg + f->avg / 3)))); 1354cabdff1aSopenharmony_ci /* equivalent to the following code 1355cabdff1aSopenharmony_ci if (absres <= f->avg * 4 / 3) 1356cabdff1aSopenharmony_ci *f->adaptcoeffs = APESIGN(res) * 8; 1357cabdff1aSopenharmony_ci else if (absres <= f->avg * 3) 1358cabdff1aSopenharmony_ci *f->adaptcoeffs = APESIGN(res) * 16; 1359cabdff1aSopenharmony_ci else 1360cabdff1aSopenharmony_ci *f->adaptcoeffs = APESIGN(res) * 32; 1361cabdff1aSopenharmony_ci */ 1362cabdff1aSopenharmony_ci else 1363cabdff1aSopenharmony_ci *f->adaptcoeffs = 0; 1364cabdff1aSopenharmony_ci 1365cabdff1aSopenharmony_ci f->avg += (int)(absres - (unsigned)f->avg) / 16; 1366cabdff1aSopenharmony_ci 1367cabdff1aSopenharmony_ci f->adaptcoeffs[-1] >>= 1; 1368cabdff1aSopenharmony_ci f->adaptcoeffs[-2] >>= 1; 1369cabdff1aSopenharmony_ci f->adaptcoeffs[-8] >>= 1; 1370cabdff1aSopenharmony_ci } 1371cabdff1aSopenharmony_ci 1372cabdff1aSopenharmony_ci f->adaptcoeffs++; 1373cabdff1aSopenharmony_ci 1374cabdff1aSopenharmony_ci /* Have we filled the history buffer? */ 1375cabdff1aSopenharmony_ci if (f->delay == f->historybuffer + HISTORY_SIZE + (order * 2)) { 1376cabdff1aSopenharmony_ci memmove(f->historybuffer, f->delay - (order * 2), 1377cabdff1aSopenharmony_ci (order * 2) * sizeof(*f->historybuffer)); 1378cabdff1aSopenharmony_ci f->delay = f->historybuffer + order * 2; 1379cabdff1aSopenharmony_ci f->adaptcoeffs = f->historybuffer + order; 1380cabdff1aSopenharmony_ci } 1381cabdff1aSopenharmony_ci } 1382cabdff1aSopenharmony_ci} 1383cabdff1aSopenharmony_ci 1384cabdff1aSopenharmony_cistatic void apply_filter(APEContext *ctx, APEFilter *f, 1385cabdff1aSopenharmony_ci int32_t *data0, int32_t *data1, 1386cabdff1aSopenharmony_ci int count, int order, int fracbits) 1387cabdff1aSopenharmony_ci{ 1388cabdff1aSopenharmony_ci do_apply_filter(ctx, ctx->fileversion, &f[0], data0, count, order, fracbits); 1389cabdff1aSopenharmony_ci if (data1) 1390cabdff1aSopenharmony_ci do_apply_filter(ctx, ctx->fileversion, &f[1], data1, count, order, fracbits); 1391cabdff1aSopenharmony_ci} 1392cabdff1aSopenharmony_ci 1393cabdff1aSopenharmony_cistatic void ape_apply_filters(APEContext *ctx, int32_t *decoded0, 1394cabdff1aSopenharmony_ci int32_t *decoded1, int count) 1395cabdff1aSopenharmony_ci{ 1396cabdff1aSopenharmony_ci int i; 1397cabdff1aSopenharmony_ci 1398cabdff1aSopenharmony_ci for (i = 0; i < APE_FILTER_LEVELS; i++) { 1399cabdff1aSopenharmony_ci if (!ape_filter_orders[ctx->fset][i]) 1400cabdff1aSopenharmony_ci break; 1401cabdff1aSopenharmony_ci apply_filter(ctx, ctx->filters[i], decoded0, decoded1, count, 1402cabdff1aSopenharmony_ci ape_filter_orders[ctx->fset][i], 1403cabdff1aSopenharmony_ci ape_filter_fracbits[ctx->fset][i]); 1404cabdff1aSopenharmony_ci } 1405cabdff1aSopenharmony_ci} 1406cabdff1aSopenharmony_ci 1407cabdff1aSopenharmony_cistatic int init_frame_decoder(APEContext *ctx) 1408cabdff1aSopenharmony_ci{ 1409cabdff1aSopenharmony_ci int i, ret; 1410cabdff1aSopenharmony_ci if ((ret = init_entropy_decoder(ctx)) < 0) 1411cabdff1aSopenharmony_ci return ret; 1412cabdff1aSopenharmony_ci init_predictor_decoder(ctx); 1413cabdff1aSopenharmony_ci 1414cabdff1aSopenharmony_ci for (i = 0; i < APE_FILTER_LEVELS; i++) { 1415cabdff1aSopenharmony_ci if (!ape_filter_orders[ctx->fset][i]) 1416cabdff1aSopenharmony_ci break; 1417cabdff1aSopenharmony_ci init_filter(ctx, ctx->filters[i], ctx->filterbuf[i], 1418cabdff1aSopenharmony_ci ape_filter_orders[ctx->fset][i]); 1419cabdff1aSopenharmony_ci } 1420cabdff1aSopenharmony_ci return 0; 1421cabdff1aSopenharmony_ci} 1422cabdff1aSopenharmony_ci 1423cabdff1aSopenharmony_cistatic void ape_unpack_mono(APEContext *ctx, int count) 1424cabdff1aSopenharmony_ci{ 1425cabdff1aSopenharmony_ci if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) { 1426cabdff1aSopenharmony_ci /* We are pure silence, so we're done. */ 1427cabdff1aSopenharmony_ci av_log(ctx->avctx, AV_LOG_DEBUG, "pure silence mono\n"); 1428cabdff1aSopenharmony_ci return; 1429cabdff1aSopenharmony_ci } 1430cabdff1aSopenharmony_ci 1431cabdff1aSopenharmony_ci ctx->entropy_decode_mono(ctx, count); 1432cabdff1aSopenharmony_ci if (ctx->error) 1433cabdff1aSopenharmony_ci return; 1434cabdff1aSopenharmony_ci 1435cabdff1aSopenharmony_ci /* Now apply the predictor decoding */ 1436cabdff1aSopenharmony_ci ctx->predictor_decode_mono(ctx, count); 1437cabdff1aSopenharmony_ci 1438cabdff1aSopenharmony_ci /* Pseudo-stereo - just copy left channel to right channel */ 1439cabdff1aSopenharmony_ci if (ctx->channels == 2) { 1440cabdff1aSopenharmony_ci memcpy(ctx->decoded[1], ctx->decoded[0], count * sizeof(*ctx->decoded[1])); 1441cabdff1aSopenharmony_ci } 1442cabdff1aSopenharmony_ci} 1443cabdff1aSopenharmony_ci 1444cabdff1aSopenharmony_cistatic void ape_unpack_stereo(APEContext *ctx, int count) 1445cabdff1aSopenharmony_ci{ 1446cabdff1aSopenharmony_ci unsigned left, right; 1447cabdff1aSopenharmony_ci int32_t *decoded0 = ctx->decoded[0]; 1448cabdff1aSopenharmony_ci int32_t *decoded1 = ctx->decoded[1]; 1449cabdff1aSopenharmony_ci 1450cabdff1aSopenharmony_ci if ((ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) == APE_FRAMECODE_STEREO_SILENCE) { 1451cabdff1aSopenharmony_ci /* We are pure silence, so we're done. */ 1452cabdff1aSopenharmony_ci av_log(ctx->avctx, AV_LOG_DEBUG, "pure silence stereo\n"); 1453cabdff1aSopenharmony_ci return; 1454cabdff1aSopenharmony_ci } 1455cabdff1aSopenharmony_ci 1456cabdff1aSopenharmony_ci ctx->entropy_decode_stereo(ctx, count); 1457cabdff1aSopenharmony_ci if (ctx->error) 1458cabdff1aSopenharmony_ci return; 1459cabdff1aSopenharmony_ci 1460cabdff1aSopenharmony_ci /* Now apply the predictor decoding */ 1461cabdff1aSopenharmony_ci ctx->predictor_decode_stereo(ctx, count); 1462cabdff1aSopenharmony_ci 1463cabdff1aSopenharmony_ci /* Decorrelate and scale to output depth */ 1464cabdff1aSopenharmony_ci while (count--) { 1465cabdff1aSopenharmony_ci left = *decoded1 - (unsigned)(*decoded0 / 2); 1466cabdff1aSopenharmony_ci right = left + *decoded0; 1467cabdff1aSopenharmony_ci 1468cabdff1aSopenharmony_ci *(decoded0++) = left; 1469cabdff1aSopenharmony_ci *(decoded1++) = right; 1470cabdff1aSopenharmony_ci } 1471cabdff1aSopenharmony_ci} 1472cabdff1aSopenharmony_ci 1473cabdff1aSopenharmony_cistatic int ape_decode_frame(AVCodecContext *avctx, AVFrame *frame, 1474cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 1475cabdff1aSopenharmony_ci{ 1476cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 1477cabdff1aSopenharmony_ci APEContext *s = avctx->priv_data; 1478cabdff1aSopenharmony_ci uint8_t *sample8; 1479cabdff1aSopenharmony_ci int16_t *sample16; 1480cabdff1aSopenharmony_ci int32_t *sample24; 1481cabdff1aSopenharmony_ci int i, ch, ret; 1482cabdff1aSopenharmony_ci int blockstodecode; 1483cabdff1aSopenharmony_ci uint64_t decoded_buffer_size; 1484cabdff1aSopenharmony_ci 1485cabdff1aSopenharmony_ci /* this should never be negative, but bad things will happen if it is, so 1486cabdff1aSopenharmony_ci check it just to make sure. */ 1487cabdff1aSopenharmony_ci av_assert0(s->samples >= 0); 1488cabdff1aSopenharmony_ci 1489cabdff1aSopenharmony_ci if(!s->samples){ 1490cabdff1aSopenharmony_ci uint32_t nblocks, offset; 1491cabdff1aSopenharmony_ci int buf_size; 1492cabdff1aSopenharmony_ci 1493cabdff1aSopenharmony_ci if (!avpkt->size) { 1494cabdff1aSopenharmony_ci *got_frame_ptr = 0; 1495cabdff1aSopenharmony_ci return 0; 1496cabdff1aSopenharmony_ci } 1497cabdff1aSopenharmony_ci if (avpkt->size < 8) { 1498cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); 1499cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1500cabdff1aSopenharmony_ci } 1501cabdff1aSopenharmony_ci buf_size = avpkt->size & ~3; 1502cabdff1aSopenharmony_ci if (buf_size != avpkt->size) { 1503cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. " 1504cabdff1aSopenharmony_ci "extra bytes at the end will be skipped.\n"); 1505cabdff1aSopenharmony_ci } 1506cabdff1aSopenharmony_ci if (s->fileversion < 3950) // previous versions overread two bytes 1507cabdff1aSopenharmony_ci buf_size += 2; 1508cabdff1aSopenharmony_ci av_fast_padded_malloc(&s->data, &s->data_size, buf_size); 1509cabdff1aSopenharmony_ci if (!s->data) 1510cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1511cabdff1aSopenharmony_ci s->bdsp.bswap_buf((uint32_t *) s->data, (const uint32_t *) buf, 1512cabdff1aSopenharmony_ci buf_size >> 2); 1513cabdff1aSopenharmony_ci memset(s->data + (buf_size & ~3), 0, buf_size & 3); 1514cabdff1aSopenharmony_ci s->ptr = s->data; 1515cabdff1aSopenharmony_ci s->data_end = s->data + buf_size; 1516cabdff1aSopenharmony_ci 1517cabdff1aSopenharmony_ci nblocks = bytestream_get_be32(&s->ptr); 1518cabdff1aSopenharmony_ci offset = bytestream_get_be32(&s->ptr); 1519cabdff1aSopenharmony_ci if (s->fileversion >= 3900) { 1520cabdff1aSopenharmony_ci if (offset > 3) { 1521cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Incorrect offset passed\n"); 1522cabdff1aSopenharmony_ci av_freep(&s->data); 1523cabdff1aSopenharmony_ci s->data_size = 0; 1524cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1525cabdff1aSopenharmony_ci } 1526cabdff1aSopenharmony_ci if (s->data_end - s->ptr < offset) { 1527cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); 1528cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1529cabdff1aSopenharmony_ci } 1530cabdff1aSopenharmony_ci s->ptr += offset; 1531cabdff1aSopenharmony_ci } else { 1532cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, s->ptr, s->data_end - s->ptr)) < 0) 1533cabdff1aSopenharmony_ci return ret; 1534cabdff1aSopenharmony_ci if (s->fileversion > 3800) 1535cabdff1aSopenharmony_ci skip_bits_long(&s->gb, offset * 8); 1536cabdff1aSopenharmony_ci else 1537cabdff1aSopenharmony_ci skip_bits_long(&s->gb, offset); 1538cabdff1aSopenharmony_ci } 1539cabdff1aSopenharmony_ci 1540cabdff1aSopenharmony_ci if (!nblocks || nblocks > INT_MAX / 2 / sizeof(*s->decoded_buffer) - 8) { 1541cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid sample count: %"PRIu32".\n", 1542cabdff1aSopenharmony_ci nblocks); 1543cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1544cabdff1aSopenharmony_ci } 1545cabdff1aSopenharmony_ci 1546cabdff1aSopenharmony_ci /* Initialize the frame decoder */ 1547cabdff1aSopenharmony_ci if (init_frame_decoder(s) < 0) { 1548cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error reading frame header\n"); 1549cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1550cabdff1aSopenharmony_ci } 1551cabdff1aSopenharmony_ci s->samples = nblocks; 1552cabdff1aSopenharmony_ci } 1553cabdff1aSopenharmony_ci 1554cabdff1aSopenharmony_ci if (!s->data) { 1555cabdff1aSopenharmony_ci *got_frame_ptr = 0; 1556cabdff1aSopenharmony_ci return avpkt->size; 1557cabdff1aSopenharmony_ci } 1558cabdff1aSopenharmony_ci 1559cabdff1aSopenharmony_ci blockstodecode = FFMIN(s->blocks_per_loop, s->samples); 1560cabdff1aSopenharmony_ci // for old files coefficients were not interleaved, 1561cabdff1aSopenharmony_ci // so we need to decode all of them at once 1562cabdff1aSopenharmony_ci if (s->fileversion < 3930) 1563cabdff1aSopenharmony_ci blockstodecode = s->samples; 1564cabdff1aSopenharmony_ci 1565cabdff1aSopenharmony_ci /* reallocate decoded sample buffer if needed */ 1566cabdff1aSopenharmony_ci decoded_buffer_size = 2LL * FFALIGN(blockstodecode, 8) * sizeof(*s->decoded_buffer); 1567cabdff1aSopenharmony_ci av_assert0(decoded_buffer_size <= INT_MAX); 1568cabdff1aSopenharmony_ci 1569cabdff1aSopenharmony_ci /* get output buffer */ 1570cabdff1aSopenharmony_ci frame->nb_samples = blockstodecode; 1571cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { 1572cabdff1aSopenharmony_ci s->samples=0; 1573cabdff1aSopenharmony_ci return ret; 1574cabdff1aSopenharmony_ci } 1575cabdff1aSopenharmony_ci 1576cabdff1aSopenharmony_ci av_fast_malloc(&s->decoded_buffer, &s->decoded_size, decoded_buffer_size); 1577cabdff1aSopenharmony_ci if (!s->decoded_buffer) 1578cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1579cabdff1aSopenharmony_ci memset(s->decoded_buffer, 0, decoded_buffer_size); 1580cabdff1aSopenharmony_ci s->decoded[0] = s->decoded_buffer; 1581cabdff1aSopenharmony_ci s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8); 1582cabdff1aSopenharmony_ci 1583cabdff1aSopenharmony_ci s->error=0; 1584cabdff1aSopenharmony_ci 1585cabdff1aSopenharmony_ci if ((s->channels == 1) || (s->frameflags & APE_FRAMECODE_PSEUDO_STEREO)) 1586cabdff1aSopenharmony_ci ape_unpack_mono(s, blockstodecode); 1587cabdff1aSopenharmony_ci else 1588cabdff1aSopenharmony_ci ape_unpack_stereo(s, blockstodecode); 1589cabdff1aSopenharmony_ci emms_c(); 1590cabdff1aSopenharmony_ci 1591cabdff1aSopenharmony_ci if (s->error) { 1592cabdff1aSopenharmony_ci s->samples=0; 1593cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error decoding frame\n"); 1594cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1595cabdff1aSopenharmony_ci } 1596cabdff1aSopenharmony_ci 1597cabdff1aSopenharmony_ci switch (s->bps) { 1598cabdff1aSopenharmony_ci case 8: 1599cabdff1aSopenharmony_ci for (ch = 0; ch < s->channels; ch++) { 1600cabdff1aSopenharmony_ci sample8 = (uint8_t *)frame->data[ch]; 1601cabdff1aSopenharmony_ci for (i = 0; i < blockstodecode; i++) 1602cabdff1aSopenharmony_ci *sample8++ = (s->decoded[ch][i] + 0x80U) & 0xff; 1603cabdff1aSopenharmony_ci } 1604cabdff1aSopenharmony_ci break; 1605cabdff1aSopenharmony_ci case 16: 1606cabdff1aSopenharmony_ci for (ch = 0; ch < s->channels; ch++) { 1607cabdff1aSopenharmony_ci sample16 = (int16_t *)frame->data[ch]; 1608cabdff1aSopenharmony_ci for (i = 0; i < blockstodecode; i++) 1609cabdff1aSopenharmony_ci *sample16++ = s->decoded[ch][i]; 1610cabdff1aSopenharmony_ci } 1611cabdff1aSopenharmony_ci break; 1612cabdff1aSopenharmony_ci case 24: 1613cabdff1aSopenharmony_ci for (ch = 0; ch < s->channels; ch++) { 1614cabdff1aSopenharmony_ci sample24 = (int32_t *)frame->data[ch]; 1615cabdff1aSopenharmony_ci for (i = 0; i < blockstodecode; i++) 1616cabdff1aSopenharmony_ci *sample24++ = s->decoded[ch][i] * 256U; 1617cabdff1aSopenharmony_ci } 1618cabdff1aSopenharmony_ci break; 1619cabdff1aSopenharmony_ci } 1620cabdff1aSopenharmony_ci 1621cabdff1aSopenharmony_ci s->samples -= blockstodecode; 1622cabdff1aSopenharmony_ci 1623cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_CRCCHECK && 1624cabdff1aSopenharmony_ci s->fileversion >= 3900) { 1625cabdff1aSopenharmony_ci uint32_t crc = s->CRC_state; 1626cabdff1aSopenharmony_ci const AVCRC *crc_tab = av_crc_get_table(AV_CRC_32_IEEE_LE); 1627cabdff1aSopenharmony_ci int stride = s->bps == 24 ? 4 : (s->bps>>3); 1628cabdff1aSopenharmony_ci int offset = s->bps == 24; 1629cabdff1aSopenharmony_ci int bytes = s->bps >> 3; 1630cabdff1aSopenharmony_ci 1631cabdff1aSopenharmony_ci for (i = 0; i < blockstodecode; i++) { 1632cabdff1aSopenharmony_ci for (ch = 0; ch < s->channels; ch++) { 1633cabdff1aSopenharmony_ci#if HAVE_BIGENDIAN 1634cabdff1aSopenharmony_ci uint8_t *smp_native = frame->data[ch] + i*stride; 1635cabdff1aSopenharmony_ci uint8_t smp[4]; 1636cabdff1aSopenharmony_ci for(int j = 0; j<stride; j++) 1637cabdff1aSopenharmony_ci smp[j] = smp_native[stride-j-1]; 1638cabdff1aSopenharmony_ci#else 1639cabdff1aSopenharmony_ci uint8_t *smp = frame->data[ch] + i*stride; 1640cabdff1aSopenharmony_ci#endif 1641cabdff1aSopenharmony_ci crc = av_crc(crc_tab, crc, smp+offset, bytes); 1642cabdff1aSopenharmony_ci } 1643cabdff1aSopenharmony_ci } 1644cabdff1aSopenharmony_ci 1645cabdff1aSopenharmony_ci if (!s->samples && (~crc >> 1) ^ s->CRC) { 1646cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "CRC mismatch! Previously decoded " 1647cabdff1aSopenharmony_ci "frames may have been affected as well.\n"); 1648cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_EXPLODE) 1649cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1650cabdff1aSopenharmony_ci } 1651cabdff1aSopenharmony_ci 1652cabdff1aSopenharmony_ci s->CRC_state = crc; 1653cabdff1aSopenharmony_ci } 1654cabdff1aSopenharmony_ci 1655cabdff1aSopenharmony_ci *got_frame_ptr = 1; 1656cabdff1aSopenharmony_ci 1657cabdff1aSopenharmony_ci return !s->samples ? avpkt->size : 0; 1658cabdff1aSopenharmony_ci} 1659cabdff1aSopenharmony_ci 1660cabdff1aSopenharmony_cistatic void ape_flush(AVCodecContext *avctx) 1661cabdff1aSopenharmony_ci{ 1662cabdff1aSopenharmony_ci APEContext *s = avctx->priv_data; 1663cabdff1aSopenharmony_ci s->samples= 0; 1664cabdff1aSopenharmony_ci} 1665cabdff1aSopenharmony_ci 1666cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(APEContext, x) 1667cabdff1aSopenharmony_ci#define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM) 1668cabdff1aSopenharmony_cistatic const AVOption options[] = { 1669cabdff1aSopenharmony_ci { "max_samples", "maximum number of samples decoded per call", OFFSET(blocks_per_loop), AV_OPT_TYPE_INT, { .i64 = 4608 }, 1, INT_MAX, PAR, "max_samples" }, 1670cabdff1aSopenharmony_ci { "all", "no maximum. decode all samples for each packet at once", 0, AV_OPT_TYPE_CONST, { .i64 = INT_MAX }, INT_MIN, INT_MAX, PAR, "max_samples" }, 1671cabdff1aSopenharmony_ci { NULL}, 1672cabdff1aSopenharmony_ci}; 1673cabdff1aSopenharmony_ci 1674cabdff1aSopenharmony_cistatic const AVClass ape_decoder_class = { 1675cabdff1aSopenharmony_ci .class_name = "APE decoder", 1676cabdff1aSopenharmony_ci .item_name = av_default_item_name, 1677cabdff1aSopenharmony_ci .option = options, 1678cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 1679cabdff1aSopenharmony_ci}; 1680cabdff1aSopenharmony_ci 1681cabdff1aSopenharmony_ciconst FFCodec ff_ape_decoder = { 1682cabdff1aSopenharmony_ci .p.name = "ape", 1683cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Monkey's Audio"), 1684cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1685cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_APE, 1686cabdff1aSopenharmony_ci .priv_data_size = sizeof(APEContext), 1687cabdff1aSopenharmony_ci .init = ape_decode_init, 1688cabdff1aSopenharmony_ci .close = ape_decode_close, 1689cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(ape_decode_frame), 1690cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DELAY | 1691cabdff1aSopenharmony_ci AV_CODEC_CAP_DR1, 1692cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1693cabdff1aSopenharmony_ci .flush = ape_flush, 1694cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P, 1695cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S16P, 1696cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32P, 1697cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 1698cabdff1aSopenharmony_ci .p.priv_class = &ape_decoder_class, 1699cabdff1aSopenharmony_ci}; 1700