📄 apedec.c
字号:
/* * Monkey's Audio lossless audio decoder * Copyright (c) 2007 Benjamin Zores <ben@geexbox.org> * based upon libdemac from Dave Chapman. * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#define ALT_BITSTREAM_READER_LE#include "avcodec.h"#include "dsputil.h"#include "bitstream.h"#include "bytestream.h"#undef memcpy#define memcpy uc_memcpy/** * @file apedec.c * Monkey's Audio lossless audio decoder */#define BLOCKS_PER_LOOP 4608#define MAX_CHANNELS 2#define MAX_BYTESPERSAMPLE 3#define APE_FRAMECODE_MONO_SILENCE 1#define APE_FRAMECODE_STEREO_SILENCE 3#define APE_FRAMECODE_PSEUDO_STEREO 4#define HISTORY_SIZE 512#define PREDICTOR_ORDER 8/** Total size of all predictor histories */#define PREDICTOR_SIZE 50#define YDELAYA (18 + PREDICTOR_ORDER*4)#define YDELAYB (18 + PREDICTOR_ORDER*3)#define XDELAYA (18 + PREDICTOR_ORDER*2)#define XDELAYB (18 + PREDICTOR_ORDER)#define YADAPTCOEFFSA 18#define XADAPTCOEFFSA 14#define YADAPTCOEFFSB 10#define XADAPTCOEFFSB 5/** * Possible compression levels * @{ */enum APECompressionLevel { COMPRESSION_LEVEL_FAST = 1000, COMPRESSION_LEVEL_NORMAL = 2000, COMPRESSION_LEVEL_HIGH = 3000, COMPRESSION_LEVEL_EXTRA_HIGH = 4000, COMPRESSION_LEVEL_INSANE = 5000};/** @} */#define APE_FILTER_LEVELS 3/** Filter orders depending on compression level */static const uint16_t ape_filter_orders[5][APE_FILTER_LEVELS] = { { 0, 0, 0 }, { 16, 0, 0 }, { 64, 0, 0 }, { 32, 256, 0 }, { 16, 256, 1280 }};/** Filter fraction bits depending on compression level */static const uint16_t ape_filter_fracbits[5][APE_FILTER_LEVELS] = { { 0, 0, 0 }, { 11, 0, 0 }, { 11, 0, 0 }, { 10, 13, 0 }, { 11, 13, 15 }};/** Filters applied to the decoded data */typedef struct APEFilter { int16_t *coeffs; ///< actual coefficients used in filtering int16_t *adaptcoeffs; ///< adaptive filter coefficients used for correcting of actual filter coefficients int16_t *historybuffer; ///< filter memory int16_t *delay; ///< filtered values int avg;} APEFilter;typedef struct APERice { uint32_t k; uint32_t ksum;} APERice;typedef struct APERangecoder { uint32_t low; ///< low end of interval uint32_t range; ///< length of interval uint32_t help; ///< bytes_to_follow resp. intermediate value unsigned int buffer; ///< buffer for input/output} APERangecoder;/** Filter histories */typedef struct APEPredictor { int32_t *buf; int32_t lastA[2]; int32_t filterA[2]; int32_t filterB[2]; int32_t coeffsA[2][4]; ///< adaption coefficients int32_t coeffsB[2][5]; ///< adaption coefficients int32_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE];} APEPredictor;/** Decoder context */typedef struct APEContext { AVCodecContext *avctx; DSPContext dsp; int channels; int samples; ///< samples left to decode in current frame int fileversion; ///< codec version, very important in decoding process int compression_level; ///< compression levels int fset; ///< which filter set to use (calculated from compression level) int flags; ///< global decoder flags uint32_t CRC; ///< frame CRC int frameflags; ///< frame flags int currentframeblocks; ///< samples (per channel) in current frame int blocksdecoded; ///< count of decoded samples in current frame APEPredictor predictor; ///< predictor used for final reconstruction int32_t decoded0[BLOCKS_PER_LOOP]; ///< decoded data for the first channel int32_t decoded1[BLOCKS_PER_LOOP]; ///< decoded data for the second channel int16_t* filterbuf[APE_FILTER_LEVELS]; ///< filter memory APERangecoder rc; ///< rangecoder used to decode actual values APERice riceX; ///< rice code parameters for the second channel APERice riceY; ///< rice code parameters for the first channel APEFilter filters[APE_FILTER_LEVELS][2]; ///< filters used for reconstruction uint8_t *data; ///< current frame data uint8_t *data_end; ///< frame data end uint8_t *ptr; ///< current position in frame data uint8_t *last_ptr; ///< position where last 4608-sample block ended} APEContext;// TODO: dsputilizestatic inline void vector_add(int16_t * v1, int16_t * v2, int order){ while (order--) *v1++ += *v2++;}// TODO: dsputilizestatic inline void vector_sub(int16_t * v1, int16_t * v2, int order){ while (order--) *v1++ -= *v2++;}// TODO: dsputilizestatic inline int32_t scalarproduct(int16_t * v1, int16_t * v2, int order){ int res = 0; while (order--) res += *v1++ * *v2++; return res;}static int ape_decode_init(AVCodecContext * avctx){ APEContext *s = avctx->priv_data; int i; if (avctx->extradata_size != 6) { av_log(avctx, AV_LOG_ERROR, "Incorrect extradata\n"); return -1; } if (avctx->bits_per_sample != 16) { av_log(avctx, AV_LOG_ERROR, "Only 16-bit samples are supported\n"); return -1; } if (avctx->channels > 2) { av_log(avctx, AV_LOG_ERROR, "Only mono and stereo is supported\n"); return -1; } s->avctx = avctx; s->channels = avctx->channels; s->fileversion = AV_RL16(avctx->extradata); s->compression_level = AV_RL16(avctx->extradata + 2); s->flags = AV_RL16(avctx->extradata + 4); av_log(avctx, AV_LOG_DEBUG, "Compression Level: %d - Flags: %d\n", s->compression_level, s->flags); if (s->compression_level % 1000 || s->compression_level > COMPRESSION_LEVEL_INSANE) { av_log(avctx, AV_LOG_ERROR, "Incorrect compression level %d\n", s->compression_level); return -1; } s->fset = s->compression_level / 1000 - 1; for (i = 0; i < APE_FILTER_LEVELS; i++) { if (!ape_filter_orders[s->fset][i]) break; s->filterbuf[i] = av_malloc((ape_filter_orders[s->fset][i] * 3 + HISTORY_SIZE) * 4); } dsputil_init(&s->dsp, avctx); return 0;}static int ape_decode_close(AVCodecContext * avctx){ APEContext *s = avctx->priv_data; int i; for (i = 0; i < APE_FILTER_LEVELS; i++) av_freep(&s->filterbuf[i]); return 0;}/** * @defgroup rangecoder APE range decoder * @{ */#define CODE_BITS 32#define TOP_VALUE ((unsigned int)1 << (CODE_BITS-1))#define SHIFT_BITS (CODE_BITS - 9)#define EXTRA_BITS ((CODE_BITS-2) % 8 + 1)#define BOTTOM_VALUE (TOP_VALUE >> 8)/** Start the decoder */static inline void range_start_decoding(APEContext * ctx){ ctx->rc.buffer = bytestream_get_byte(&ctx->ptr); ctx->rc.low = ctx->rc.buffer >> (8 - EXTRA_BITS); ctx->rc.range = (uint32_t) 1 << EXTRA_BITS;}/** Perform normalization */static inline void range_dec_normalize(APEContext * ctx){ while (ctx->rc.range <= BOTTOM_VALUE) { ctx->rc.buffer = (ctx->rc.buffer << 8) | bytestream_get_byte(&ctx->ptr); ctx->rc.low = (ctx->rc.low << 8) | ((ctx->rc.buffer >> 1) & 0xFF); ctx->rc.range <<= 8; }}/** * Calculate culmulative frequency for next symbol. Does NO update! * @param tot_f is the total frequency or (code_value)1<<shift * @return the culmulative frequency */static inline int range_decode_culfreq(APEContext * ctx, int tot_f){ range_dec_normalize(ctx); ctx->rc.help = ctx->rc.range / tot_f; return ctx->rc.low / ctx->rc.help;}/** * Decode value with given size in bits * @param shift number of bits to decode */static inline int range_decode_culshift(APEContext * ctx, int shift){ range_dec_normalize(ctx); ctx->rc.help = ctx->rc.range >> shift; return ctx->rc.low / ctx->rc.help;}/** * Update decoding state * @param sy_f the interval length (frequency of the symbol) * @param lt_f the lower end (frequency sum of < symbols) */static inline void range_decode_update(APEContext * ctx, int sy_f, int lt_f){ ctx->rc.low -= ctx->rc.help * lt_f; ctx->rc.range = ctx->rc.help * sy_f;}/** Decode n bits (n <= 16) without modelling */static inline int range_decode_bits(APEContext * ctx, int n){ int sym = range_decode_culshift(ctx, n); range_decode_update(ctx, 1, sym); return sym;}#define MODEL_ELEMENTS 64/** * Fixed probabilities for symbols in Monkey Audio version 3.97 */static const uint32_t counts_3970[65] = { 0, 14824, 28224, 39348, 47855, 53994, 58171, 60926, 62682, 63786, 64463, 64878, 65126, 65276, 65365, 65419, 65450, 65469, 65480, 65487, 65491, 65493, 65494, 65495, 65496, 65497, 65498, 65499, 65500, 65501, 65502, 65503, 65504, 65505, 65506, 65507, 65508, 65509, 65510, 65511, 65512, 65513, 65514, 65515, 65516, 65517, 65518, 65519, 65520, 65521, 65522, 65523, 65524, 65525, 65526, 65527, 65528, 65529, 65530, 65531, 65532, 65533, 65534, 65535, 65536};/** * Probability ranges for symbols in Monkey Audio version 3.97 */static const uint16_t counts_diff_3970[64] = { 14824, 13400, 11124, 8507, 6139, 4177, 2755, 1756, 1104, 677, 415, 248, 150, 89, 54, 31, 19, 11, 7, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};/** * Fixed probabilities for symbols in Monkey Audio version 3.98 */static const uint32_t counts_3980[65] = { 0, 19578, 36160, 48417, 56323, 60899, 63265, 64435, 64971, 65232, 65351, 65416, 65447, 65466, 65476, 65482, 65485, 65488, 65490, 65491, 65492, 65493, 65494, 65495, 65496, 65497, 65498, 65499, 65500, 65501, 65502, 65503, 65504, 65505, 65506, 65507, 65508, 65509, 65510, 65511, 65512, 65513, 65514, 65515, 65516, 65517, 65518, 65519, 65520, 65521, 65522, 65523, 65524, 65525, 65526, 65527, 65528, 65529, 65530, 65531, 65532, 65533, 65534, 65535, 65536};/** * Probability ranges for symbols in Monkey Audio version 3.98 */static const uint16_t counts_diff_3980[64] = { 19578, 16582, 12257, 7906, 4576, 2366, 1170, 536, 261, 119, 65, 31, 19, 10, 6, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};/** * Decode symbol * @param counts probability range start position * @param count_diffs probability range widths */static inline int range_get_symbol(APEContext * ctx, const uint32_t counts[], const uint16_t counts_diff[]){ int symbol, cf; cf = range_decode_culshift(ctx, 16); /* figure out the symbol inefficiently; a binary search would be much better */ for (symbol = 0; counts[symbol + 1] <= cf; symbol++); range_decode_update(ctx, counts_diff[symbol], counts[symbol]); return symbol;}/** @} */ // group rangecoderstatic inline void update_rice(APERice *rice, int x){ rice->ksum += ((x + 1) / 2) - ((rice->ksum + 16) >> 5); if (rice->k == 0) rice->k = 1; else if (rice->ksum < (1 << (rice->k + 4))) rice->k--; else if (rice->ksum >= (1 << (rice->k + 5))) rice->k++;}static inline int ape_decode_value(APEContext * ctx, APERice *rice){ int x, overflow; if (ctx->fileversion < 3980) { int tmpk; overflow = range_get_symbol(ctx, counts_3970, counts_diff_3970); if (overflow == (MODEL_ELEMENTS - 1)) { tmpk = range_decode_bits(ctx, 5); overflow = 0; } else tmpk = (rice->k < 1) ? 0 : rice->k - 1; if (tmpk <= 16) x = range_decode_bits(ctx, tmpk); else { x = range_decode_bits(ctx, 16); x |= (range_decode_bits(ctx, tmpk - 16) << 16); } x += overflow << tmpk; } else { int base, pivot; pivot = rice->ksum >> 5; if (pivot == 0) pivot = 1; overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980); if (overflow == (MODEL_ELEMENTS - 1)) { overflow = range_decode_bits(ctx, 16) << 16; overflow |= range_decode_bits(ctx, 16); } base = range_decode_culfreq(ctx, pivot); range_decode_update(ctx, 1, base); x = base + overflow * pivot; } update_rice(rice, x); /* Convert to signed */ if (x & 1) return (x >> 1) + 1; else return -(x >> 1);}static void entropy_decode(APEContext * ctx, int blockstodecode, int stereo){ int32_t *decoded0 = ctx->decoded0; int32_t *decoded1 = ctx->decoded1; ctx->blocksdecoded = blockstodecode; if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -