⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apedec.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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"/** * @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 uint8_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    const uint8_t *ptr;                      ///< current position in frame data    const uint8_t *last_ptr;                 ///< position where last 4608-sample block ended    int error;} APEContext;// TODO: dsputilizestatic av_cold 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 av_cold 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 <<= 8;        if(ctx->ptr < ctx->data_end)            ctx->rc.buffer += *ctx->ptr;        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 uint16_t counts_3970[22] = {        0, 14824, 28224, 39348, 47855, 53994, 58171, 60926,    62682, 63786, 64463, 64878, 65126, 65276, 65365, 65419,    65450, 65469, 65480, 65487, 65491, 65493,};/** * Probability ranges for symbols in Monkey Audio version 3.97 */static const uint16_t counts_diff_3970[21] = {    14824, 13400, 11124, 8507, 6139, 4177, 2755, 1756,    1104, 677, 415, 248, 150, 89, 54, 31,    19, 11, 7, 4, 2,};/** * Fixed probabilities for symbols in Monkey Audio version 3.98 */static const uint16_t counts_3980[22] = {        0, 19578, 36160, 48417, 56323, 60899, 63265, 64435,    64971, 65232, 65351, 65416, 65447, 65466, 65476, 65482,    65485, 65488, 65490, 65491, 65492, 65493,};/** * Probability ranges for symbols in Monkey Audio version 3.98 */static const uint16_t counts_diff_3980[21] = {    19578, 16582, 12257, 7906, 4576, 2366, 1170, 536,    261, 119, 65, 31, 19, 10, 6, 3,    3, 2, 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 uint16_t counts[],                                   const uint16_t counts_diff[]){    int symbol, cf;    cf = range_decode_culshift(ctx, 16);    if(cf > 65492){        symbol= cf - 65535 + 63;        range_decode_update(ctx, 1, cf);        if(cf > 65535)            ctx->error=1;        return symbol;    }    /* 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) {        /* We are pure silence, just memset the output buffer. */        memset(decoded0, 0, blockstodecode * sizeof(int32_t));        memset(decoded1, 0, blockstodecode * sizeof(int32_t));    } else {        while (blockstodecode--) {            *decoded0++ = ape_decode_value(ctx, &ctx->riceY);            if (stereo)                *decoded1++ = ape_decode_value(ctx, &ctx->riceX);        }    }    if (ctx->blocksdecoded == ctx->currentframeblocks)        range_dec_normalize(ctx);   /* normalize to use up all bytes */}static void init_entropy_decoder(APEContext * ctx){    /* Read the CRC */    ctx->CRC = bytestream_get_be32(&ctx->ptr);    /* Read the frame flags if they exist */    ctx->frameflags = 0;    if ((ctx->fileversion > 3820) && (ctx->CRC & 0x80000000)) {        ctx->CRC &= ~0x80000000;        ctx->frameflags = bytestream_get_be32(&ctx->ptr);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -