annotate ffmpeg/libavcodec/apedec.c @ 13:844d341cf643 tip

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